diff --git a/0.10.html b/0.10.html index 592b81042..86af4a678 100644 --- a/0.10.html +++ b/0.10.html @@ -4,13 +4,13 @@ Overview | Fleet - +
-
Skip to main content
Version: 0.10

Overview

What is Fleet?

  • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

  • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

Configuration Management

Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

- +
Skip to main content
Version: 0.10

Overview

What is Fleet?

  • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

  • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

Configuration Management

Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

+ \ No newline at end of file diff --git a/0.10/architecture.html b/0.10/architecture.html index 3f2141f65..03f7eb175 100644 --- a/0.10/architecture.html +++ b/0.10/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

Component Overview

An overview of the components and how they interact on a high level.

Components

- +subresource of it's Cluster resource.

Component Overview

An overview of the components and how they interact on a high level.

Components

+ \ No newline at end of file diff --git a/0.10/bundle-add.html b/0.10/bundle-add.html index 4bb617fa3..cd379739e 100644 --- a/0.10/bundle-add.html +++ b/0.10/bundle-add.html @@ -4,7 +4,7 @@ Create a Bundle Resource | Fleet - + @@ -15,8 +15,8 @@ manually by the user. If you want to deploy resources from a git repository use When creating a Bundle resources need to be explicitly specified in the Bundle Spec. Resources can be compressed with gz. See here an example of how Rancher uses compression in go code.

If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in GitRepo. -See Mapping to Downstream Clusters.

The following example creates a nginx Deployment in the local cluster:

kind: Bundle
apiVersion: fleet.cattle.io/v1alpha1
metadata:
# Any name can be used here
name: my-bundle
# For single cluster use fleet-local, otherwise use the namespace of
# your choosing
namespace: fleet-local
spec:
resources:
# List of all resources that will be deployed
- content: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
name: nginx.yaml
targets:
- clusterName: local

Limitations

Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

Convert a Helm Chart into a Bundle

You can use the Fleet CLI to convert a Helm chart into a bundle.

For example, you can download and convert the "external secrets" operator chart like this:

cat > targets.yaml <<EOF
targets:
- clusterSelector: {}
EOF

mkdir app
cat > app/fleet.yaml <<EOF
defaultNamespace: external-secrets
helm:
repo: https://charts.external-secrets.io
chart: external-secrets
EOF

fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

kubectl apply -f eso-bundle.yaml

Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

- +See Mapping to Downstream Clusters.

The following example creates a nginx Deployment in the local cluster:

kind: Bundle
apiVersion: fleet.cattle.io/v1alpha1
metadata:
# Any name can be used here
name: my-bundle
# For single cluster use fleet-local, otherwise use the namespace of
# your choosing
namespace: fleet-local
spec:
resources:
# List of all resources that will be deployed
- content: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
name: nginx.yaml
targets:
- clusterName: local

Limitations

Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

Convert a Helm Chart into a Bundle

You can use the Fleet CLI to convert a Helm chart into a bundle.

For example, you can download and convert the "external secrets" operator chart like this:

cat > targets.yaml <<EOF
targets:
- clusterSelector: {}
EOF

mkdir app
cat > app/fleet.yaml <<EOF
defaultNamespace: external-secrets
helm:
repo: https://charts.external-secrets.io
chart: external-secrets
EOF

fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

kubectl apply -f eso-bundle.yaml

Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

+ \ No newline at end of file diff --git a/0.10/bundle-diffs.html b/0.10/bundle-diffs.html index c567edbfb..96f37d491 100644 --- a/0.10/bundle-diffs.html +++ b/0.10/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs to Ignore Modified GitRepos | Fleet - +
Skip to main content
Version: 0.10

Generating Diffs to Ignore Modified GitRepos

Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

This leads the status of the bundle and associated GitRepo to be reported as "Modified"

Associated Bundle -

Fleet bundles support the ability to specify a custom jsonPointer patch.

With the patch, users can instruct fleet to ignore object modifications.

Simple Example

In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

Gatekeeper Example

In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

In our case the differences detected are as follows:

  summary:
desiredReady: 1
modified: 1
nonReadyResources:
- bundleState: Modified
modifiedStatus:
- apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
name: gatekeeper-validating-webhook-configuration
patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-audit
namespace: cattle-gatekeeper-system
patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-controller-manager
namespace: cattle-gatekeeper-system
patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

Based on this summary, there are three objects which need to be patched.

We will look at these one at a time.

1. ValidatingWebhookConfiguration:

The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

From this information, we can see the two ValidatingWebhooks in question are:

  "$setElementOrder/webhooks": [
{
"name": "validation.gatekeeper.sh"
},
{
"name": "check-ignore-label.gatekeeper.sh"
}
],

Within each ValidatingWebhook, the fields that need to be ignore are as follows:

    {
"clientConfig": {
"caBundle": "Cg=="
},
"name": "validation.gatekeeper.sh",
"rules": [
{
"apiGroups": [
"*"
],
"apiVersions": [
"*"
],
"operations": [
"CREATE",
"UPDATE"
],
"resources": [
"*"
]
}
]
},

and

    {
"clientConfig": {
"caBundle": "Cg=="
},
"name": "check-ignore-label.gatekeeper.sh",
"rules": [
{
"apiGroups": [
""
],
"apiVersions": [
"*"
],
"operations": [
"CREATE",
"UPDATE"
],
"resources": [
"namespaces"
]
}
]
}

In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

Based on this information, our diff patch would look as follows:

  - apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
name: gatekeeper-validating-webhook-configuration
operations:
- {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/0/rules"}
- {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/1/rules"}

2. Deployment gatekeeper-controller-manager:

The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

{
"spec": {
"template": {
"spec": {
"$setElementOrder/containers": [
{
"name": "manager"
}
],
"containers": [
{
"name": "manager",
"resources": {
"limits": {
"cpu": "1000m"
}
}
}
],
"tolerations": []
}
}
}
}

In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

Based on this information, our diff patch would look as follows:

  - apiVersion: apps/v1
kind: Deployment
name: gatekeeper-controller-manager
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}

3. Deployment gatekeeper-audit:

The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

{
"spec": {
"template": {
"spec": {
"$setElementOrder/containers": [
{
"name": "manager"
}
],
"containers": [
{
"name": "manager",
"resources": {
"limits": {
"cpu": "1000m"
}
}
}
],
"tolerations": []
}
}
}
}

Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

Based on this information, our diff patch would look as follows:

  - apiVersion: apps/v1
kind: Deployment
name: gatekeeper-audit
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}

Combining It All Together

We can now combine all these patches as follows:

diff:
comparePatches:
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-audit
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-controller-manager
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}
- apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
name: gatekeeper-validating-webhook-configuration
operations:
- {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/0/rules"}
- {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/1/rules"}

We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

Once these are added, the GitRepo should deploy and be in "Active" status.

- +

Fleet bundles support the ability to specify a custom jsonPointer patch.

With the patch, users can instruct fleet to ignore object modifications.

Simple Example

In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

Gatekeeper Example

In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

In our case the differences detected are as follows:

  summary:
desiredReady: 1
modified: 1
nonReadyResources:
- bundleState: Modified
modifiedStatus:
- apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
name: gatekeeper-validating-webhook-configuration
patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-audit
namespace: cattle-gatekeeper-system
patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-controller-manager
namespace: cattle-gatekeeper-system
patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

Based on this summary, there are three objects which need to be patched.

We will look at these one at a time.

1. ValidatingWebhookConfiguration:

The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

From this information, we can see the two ValidatingWebhooks in question are:

  "$setElementOrder/webhooks": [
{
"name": "validation.gatekeeper.sh"
},
{
"name": "check-ignore-label.gatekeeper.sh"
}
],

Within each ValidatingWebhook, the fields that need to be ignore are as follows:

    {
"clientConfig": {
"caBundle": "Cg=="
},
"name": "validation.gatekeeper.sh",
"rules": [
{
"apiGroups": [
"*"
],
"apiVersions": [
"*"
],
"operations": [
"CREATE",
"UPDATE"
],
"resources": [
"*"
]
}
]
},

and

    {
"clientConfig": {
"caBundle": "Cg=="
},
"name": "check-ignore-label.gatekeeper.sh",
"rules": [
{
"apiGroups": [
""
],
"apiVersions": [
"*"
],
"operations": [
"CREATE",
"UPDATE"
],
"resources": [
"namespaces"
]
}
]
}

In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

Based on this information, our diff patch would look as follows:

  - apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
name: gatekeeper-validating-webhook-configuration
operations:
- {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/0/rules"}
- {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/1/rules"}

2. Deployment gatekeeper-controller-manager:

The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

{
"spec": {
"template": {
"spec": {
"$setElementOrder/containers": [
{
"name": "manager"
}
],
"containers": [
{
"name": "manager",
"resources": {
"limits": {
"cpu": "1000m"
}
}
}
],
"tolerations": []
}
}
}
}

In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

Based on this information, our diff patch would look as follows:

  - apiVersion: apps/v1
kind: Deployment
name: gatekeeper-controller-manager
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}

3. Deployment gatekeeper-audit:

The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

{
"spec": {
"template": {
"spec": {
"$setElementOrder/containers": [
{
"name": "manager"
}
],
"containers": [
{
"name": "manager",
"resources": {
"limits": {
"cpu": "1000m"
}
}
}
],
"tolerations": []
}
}
}
}

Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

Based on this information, our diff patch would look as follows:

  - apiVersion: apps/v1
kind: Deployment
name: gatekeeper-audit
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}

Combining It All Together

We can now combine all these patches as follows:

diff:
comparePatches:
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-audit
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}
- apiVersion: apps/v1
kind: Deployment
name: gatekeeper-controller-manager
namespace: cattle-gatekeeper-system
operations:
- {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
- {"op": "remove", "path": "/spec/template/spec/tolerations"}
- apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
name: gatekeeper-validating-webhook-configuration
operations:
- {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/0/rules"}
- {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
- {"op": "remove", "path":"/webhooks/1/rules"}

We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

Once these are added, the GitRepo should deploy and be in "Active" status.

+ \ No newline at end of file diff --git a/0.10/changelogs.html b/0.10/changelogs.html index 61567c84f..2c877825a 100644 --- a/0.10/changelogs.html +++ b/0.10/changelogs.html @@ -4,13 +4,13 @@ 0.10 Changelogs | Fleet - +
-
Skip to main content
- +
Skip to main content
+ \ No newline at end of file diff --git a/0.10/changelogs/changelogs/v0.10.0.html b/0.10/changelogs/changelogs/v0.10.0.html index 705016797..c6ce27675 100644 --- a/0.10/changelogs/changelogs/v0.10.0.html +++ b/0.10/changelogs/changelogs/v0.10.0.html @@ -4,13 +4,13 @@ v0.10.0 | Fleet - +
-
Skip to main content
Version: 0.10

v0.10.0

  • (github-actions[bot]) released this 2024-07-17 11:54:57 +0000 UTC*

Description

The Fleet v0.10 release brings significant changes, including a redesign that splits components into containers and switches to the controller-runtime framework. The rewritten controllers switch to structured logging. To reduce image size and complexity, v0.10 integrates the gitjob repository, merges various controller codes, and introduces new features such as sharding with node selectors, prometheus metrics, configurable leader election, and worker count for the fleet-controller. The release deprecates the "fleet test" command in favor of “target” and “deploy” with a dry-run option and adds experimental OCI content storage. Bug fixes enhance drift detection, cluster status reporting, and various operational aspects, while automation improvements bolster testing, CI, and the release workflow.

Additions

Bugfixes

  • Ignore status fields during drift detection by @aruiz14 in #2522
  • Fixes error display and improves user experience in git poller by @0xavi0 in #2542
  • Honor Helm's MaxHistory when using drift correction by @aruiz14 in #2519
  • Remove trailing comma from bootstrap template by @Danil-Grigorev in #2452
  • Do not count deleted bundledeployments in cluster status by @manno in #2454
  • Fixes infinite job generation after ForceSyncGeneration changed by @0xavi0 in #2477
  • GitRepo Initial Checkout when DisablePolling is True by @Tommy12789 in #2469
  • Filter namespaces by the kubernetes.io/metadata.name label by @raulcabello in #2009
  • Catch OCI version errors and return them by @manno in #2311
  • Make AlphabeticalPolicy string check case insensitive by @aditditto in #2216
  • Ignore not-found errors when deleting bundle deployments by @weyfonk in #2329
  • Bump helm fork to 3.14.4 by @manno in #2337
  • Add missing serviceName in fleet-agent statefulset by @p-se in #2045
  • Fix gitjob log messages for controller and webhook by @manno in #2367
  • Fix helm deployer ignoring kubeconfig CLI arg by @manno in #2112
  • Return commit for revision instead of HEAD by @0xavi0 in #2410
  • Merges gitrepo and gitops controllers by @0xavi0 in #2537
  • Partially replace cleanup with finalizers by @weyfonk in #2431
  • Moves functionality from gitrepo to gitjob controller by @0xavi0 in #2475

Redesign

Performance

  • Reduce the number of times that Bundle resources are serialized by @aruiz14 in #1952
  • Replace json-based implementation of DeepCopy on GenericMap by @aruiz14 in #1915

What's Changed

Details

CI / Automation

Details
  • Improve release api description and default by @thardeck in #2548
  • Fix flaky e2e tests by @weyfonk in #2539
  • dev: Make setup-single-cluster capable of setting up multiple clusters by @p-se in #2461
  • Remove linter from release pipeline by @thardeck in #2562
  • Fix flaky GitRepo status tests by @weyfonk in #2534
  • Include drift end-to-end tests in CI workflows by @weyfonk in #2531
  • Ignore typos in embedded file by @aruiz14 in #2528
  • Switch from omg.howdoi.website to sslip.io by @p-se in #2466
  • Fix summary and details tags in bug report template by @sbulage in #2476
  • Increase timeout and waiting for testcontainers by @manno in #2502
  • Add status reconcile tests by @manno in #2416
  • Fix flaky agent modified status test by @manno in #2504
  • E2e test to checks status fields by @rubhanazeem in #2503
  • Fixes flaky agent integration test by @0xavi0 in #2509
  • Use the same linter version in GoReleaser as for prs by @thardeck in #2511
  • Fix flaky integration test for git job with polling disabled by @weyfonk in #2514
  • Add tmate debugging info to Nightly E2E workflow by @weyfonk in #1847
  • Reduce replica count in rancher integration tests by @manno in #1840
  • Remove cache action for Go build artifacts by @weyfonk in #1867
  • Prevent debug images from creating GitHub releases by @aruiz14 in #1873
  • Use configmap example for keepResources E2E tests by @weyfonk in #1870
  • Clean up e2e test resources by @weyfonk in #1876
  • Update exact Fleet version when releasing against Rancher by @weyfonk in #1880
  • Use private configmap chart for OCI testing by @weyfonk in #1898
  • Lower debug level in dev scripts by @manno in #1903
  • Fix flaky smoke test for cluster registration by @weyfonk in #1913
  • Add acceptance tests to AKS and GKE CI workflows by @weyfonk in #1914
  • Make sure that all go.mods are tidy for new prs by @thardeck in #1942
  • Provide release.yaml charts version as array by @thardeck in #1971
  • Switch bundle diff test to use random target namespaces by @manno in #1975
  • Switch upgrade test to fleet-test-data repo by @manno in #1936
  • Remove s390x as runners are not available by @raulcabello in #1995
  • Add config for user/passwords in test infra by @manno in #1987
  • Fix flaky gitrepo test by @manno in #1999
  • Add workflow for porting issues by @aruiz14 in #2012
  • Use a different secret for GITHUB_TOKEN by @aruiz14 in #2016
  • Adapt release script to build.yaml by @thardeck in #2015
  • Add initial gitrepo controller integration test by @manno in #2034
  • Update CI up to k8s 1.29 by @manno in #2073
  • Disable cache in golangci-lint action by @manno in #2075
  • Release scripts chart dir var by @manno in #2081
  • Remove remaining s390x by @manno in #2078
  • Remove nightly image build by @manno in #2122
  • Infra e2e command uses a published fleet module by @manno in #2137
  • Add dev docs for changing the infra command by @manno in #2147
  • Add gitjob end-to-end tests with SSH key by @weyfonk in #2109
  • Add CI workflow releasing Fleet charts against a test repo by @weyfonk in #2296
  • Add initial Renovate configuration by @renovate-rancher in #2274
  • CI script to update fleet reset values by @manno in #2261
  • CI: Revert typos back to master by @0xavi0 in #2272
  • Disable FOSSA check for RC releases by @manno in #2316
  • Upgrade Fleet in Rancher only triggered manually by @manno in #2241
  • Remove zube label handling by @manno in #2270
  • Replace Drone pipeline with Github actions by @weyfonk in #2168
  • Optimize renovate config by @thardeck in #2283
  • Remove drone and dapper scripts by @manno in #2207
  • Do not mess up go toolchain during release by @thardeck in #2209
  • Duplicate integrationtests scripts for devs by @manno in #2259
  • Fix "Upgrade Fleet in Rancher To HEAD" CI by @manno in #2260
  • Fix Helm chart version computation in release workflow by @weyfonk in #2227
  • Improve release scripts by @thardeck in #2312
  • Fixes for image reference and CI by @manno in #2253
  • Improve release scripts by @thardeck in #2321
  • Bump Fleet version used within installation documentation to 0.9.3 by @rancherbot in #2338
  • Make pre-release detection automatic by @weyfonk in #2333
  • Update dev/README Dockerfile for act container image by @p-se in #2326
  • Add developer docs for monitoring by @p-se in #2189
  • Publish to docker.io/rancher (@manno)
  • Clean up metrics tests by @manno in #2387
  • Remove go.mod from infra test setup command by @manno in #2378
  • Simplify sharding end-to-end tests by @weyfonk in #2396
  • Remove go work section from dev README by @manno in #2380
  • metrics: Add E2E test for cluster deletion by @p-se in #2371
  • Ignore gosec errors in end-to-end tests infra setup by @weyfonk in #2392
  • Add sharding to Fleet deployments in CI workflows running end-to-end tests by @weyfonk in #2405
  • dev-scripts: Change apiServerURL for setup-fleet-downstream by @p-se in #2052
  • Improve logging and document issue running act in a linked git worktree by @p-se in #2372
  • metrics: make sure metrics work well with sharding by @p-se in #2420
  • Re-enable fossa by @olblak in #2446

Full Changelog: v0.9.5...v0.10.0

Download

Information retrieved from here

- +
Skip to main content
Version: 0.10

v0.10.0

  • (github-actions[bot]) released this 2024-07-17 11:54:57 +0000 UTC*

Description

The Fleet v0.10 release brings significant changes, including a redesign that splits components into containers and switches to the controller-runtime framework. The rewritten controllers switch to structured logging. To reduce image size and complexity, v0.10 integrates the gitjob repository, merges various controller codes, and introduces new features such as sharding with node selectors, prometheus metrics, configurable leader election, and worker count for the fleet-controller. The release deprecates the "fleet test" command in favor of “target” and “deploy” with a dry-run option and adds experimental OCI content storage. Bug fixes enhance drift detection, cluster status reporting, and various operational aspects, while automation improvements bolster testing, CI, and the release workflow.

Additions

Bugfixes

  • Ignore status fields during drift detection by @aruiz14 in #2522
  • Fixes error display and improves user experience in git poller by @0xavi0 in #2542
  • Honor Helm's MaxHistory when using drift correction by @aruiz14 in #2519
  • Remove trailing comma from bootstrap template by @Danil-Grigorev in #2452
  • Do not count deleted bundledeployments in cluster status by @manno in #2454
  • Fixes infinite job generation after ForceSyncGeneration changed by @0xavi0 in #2477
  • GitRepo Initial Checkout when DisablePolling is True by @Tommy12789 in #2469
  • Filter namespaces by the kubernetes.io/metadata.name label by @raulcabello in #2009
  • Catch OCI version errors and return them by @manno in #2311
  • Make AlphabeticalPolicy string check case insensitive by @aditditto in #2216
  • Ignore not-found errors when deleting bundle deployments by @weyfonk in #2329
  • Bump helm fork to 3.14.4 by @manno in #2337
  • Add missing serviceName in fleet-agent statefulset by @p-se in #2045
  • Fix gitjob log messages for controller and webhook by @manno in #2367
  • Fix helm deployer ignoring kubeconfig CLI arg by @manno in #2112
  • Return commit for revision instead of HEAD by @0xavi0 in #2410
  • Merges gitrepo and gitops controllers by @0xavi0 in #2537
  • Partially replace cleanup with finalizers by @weyfonk in #2431
  • Moves functionality from gitrepo to gitjob controller by @0xavi0 in #2475

Redesign

Performance

  • Reduce the number of times that Bundle resources are serialized by @aruiz14 in #1952
  • Replace json-based implementation of DeepCopy on GenericMap by @aruiz14 in #1915

What's Changed

Details

CI / Automation

Details
  • Improve release api description and default by @thardeck in #2548
  • Fix flaky e2e tests by @weyfonk in #2539
  • dev: Make setup-single-cluster capable of setting up multiple clusters by @p-se in #2461
  • Remove linter from release pipeline by @thardeck in #2562
  • Fix flaky GitRepo status tests by @weyfonk in #2534
  • Include drift end-to-end tests in CI workflows by @weyfonk in #2531
  • Ignore typos in embedded file by @aruiz14 in #2528
  • Switch from omg.howdoi.website to sslip.io by @p-se in #2466
  • Fix summary and details tags in bug report template by @sbulage in #2476
  • Increase timeout and waiting for testcontainers by @manno in #2502
  • Add status reconcile tests by @manno in #2416
  • Fix flaky agent modified status test by @manno in #2504
  • E2e test to checks status fields by @rubhanazeem in #2503
  • Fixes flaky agent integration test by @0xavi0 in #2509
  • Use the same linter version in GoReleaser as for prs by @thardeck in #2511
  • Fix flaky integration test for git job with polling disabled by @weyfonk in #2514
  • Add tmate debugging info to Nightly E2E workflow by @weyfonk in #1847
  • Reduce replica count in rancher integration tests by @manno in #1840
  • Remove cache action for Go build artifacts by @weyfonk in #1867
  • Prevent debug images from creating GitHub releases by @aruiz14 in #1873
  • Use configmap example for keepResources E2E tests by @weyfonk in #1870
  • Clean up e2e test resources by @weyfonk in #1876
  • Update exact Fleet version when releasing against Rancher by @weyfonk in #1880
  • Use private configmap chart for OCI testing by @weyfonk in #1898
  • Lower debug level in dev scripts by @manno in #1903
  • Fix flaky smoke test for cluster registration by @weyfonk in #1913
  • Add acceptance tests to AKS and GKE CI workflows by @weyfonk in #1914
  • Make sure that all go.mods are tidy for new prs by @thardeck in #1942
  • Provide release.yaml charts version as array by @thardeck in #1971
  • Switch bundle diff test to use random target namespaces by @manno in #1975
  • Switch upgrade test to fleet-test-data repo by @manno in #1936
  • Remove s390x as runners are not available by @raulcabello in #1995
  • Add config for user/passwords in test infra by @manno in #1987
  • Fix flaky gitrepo test by @manno in #1999
  • Add workflow for porting issues by @aruiz14 in #2012
  • Use a different secret for GITHUB_TOKEN by @aruiz14 in #2016
  • Adapt release script to build.yaml by @thardeck in #2015
  • Add initial gitrepo controller integration test by @manno in #2034
  • Update CI up to k8s 1.29 by @manno in #2073
  • Disable cache in golangci-lint action by @manno in #2075
  • Release scripts chart dir var by @manno in #2081
  • Remove remaining s390x by @manno in #2078
  • Remove nightly image build by @manno in #2122
  • Infra e2e command uses a published fleet module by @manno in #2137
  • Add dev docs for changing the infra command by @manno in #2147
  • Add gitjob end-to-end tests with SSH key by @weyfonk in #2109
  • Add CI workflow releasing Fleet charts against a test repo by @weyfonk in #2296
  • Add initial Renovate configuration by @renovate-rancher in #2274
  • CI script to update fleet reset values by @manno in #2261
  • CI: Revert typos back to master by @0xavi0 in #2272
  • Disable FOSSA check for RC releases by @manno in #2316
  • Upgrade Fleet in Rancher only triggered manually by @manno in #2241
  • Remove zube label handling by @manno in #2270
  • Replace Drone pipeline with Github actions by @weyfonk in #2168
  • Optimize renovate config by @thardeck in #2283
  • Remove drone and dapper scripts by @manno in #2207
  • Do not mess up go toolchain during release by @thardeck in #2209
  • Duplicate integrationtests scripts for devs by @manno in #2259
  • Fix "Upgrade Fleet in Rancher To HEAD" CI by @manno in #2260
  • Fix Helm chart version computation in release workflow by @weyfonk in #2227
  • Improve release scripts by @thardeck in #2312
  • Fixes for image reference and CI by @manno in #2253
  • Improve release scripts by @thardeck in #2321
  • Bump Fleet version used within installation documentation to 0.9.3 by @rancherbot in #2338
  • Make pre-release detection automatic by @weyfonk in #2333
  • Update dev/README Dockerfile for act container image by @p-se in #2326
  • Add developer docs for monitoring by @p-se in #2189
  • Publish to docker.io/rancher (@manno)
  • Clean up metrics tests by @manno in #2387
  • Remove go.mod from infra test setup command by @manno in #2378
  • Simplify sharding end-to-end tests by @weyfonk in #2396
  • Remove go work section from dev README by @manno in #2380
  • metrics: Add E2E test for cluster deletion by @p-se in #2371
  • Ignore gosec errors in end-to-end tests infra setup by @weyfonk in #2392
  • Add sharding to Fleet deployments in CI workflows running end-to-end tests by @weyfonk in #2405
  • dev-scripts: Change apiServerURL for setup-fleet-downstream by @p-se in #2052
  • Improve logging and document issue running act in a linked git worktree by @p-se in #2372
  • metrics: make sure metrics work well with sharding by @p-se in #2420
  • Re-enable fossa by @olblak in #2446

Full Changelog: v0.9.5...v0.10.0

Download

Information retrieved from here

+ \ No newline at end of file diff --git a/0.10/cli/fleet-agent.html b/0.10/cli/fleet-agent.html index 665d53ee4..964273f9b 100644 --- a/0.10/cli/fleet-agent.html +++ b/0.10/cli/fleet-agent.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet-agent

fleet-agent [flags]

Options

      --agent-scope string                An identifier used to scope the agent bundleID names, typically the same as namespace
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-h, --help help for fleet-agent
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
--namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet-agent

fleet-agent [flags]

Options

      --agent-scope string                An identifier used to scope the agent bundleID names, typically the same as namespace
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-h, --help help for fleet-agent
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
--namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-agent/fleet-agent_clusterstatus.html b/0.10/cli/fleet-agent/fleet-agent_clusterstatus.html index d39d3d025..af32c034f 100644 --- a/0.10/cli/fleet-agent/fleet-agent_clusterstatus.html +++ b/0.10/cli/fleet-agent/fleet-agent_clusterstatus.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet-agent clusterstatus

Continuously report resource status to the upstream cluster

fleet-agent clusterstatus [flags]

Options

      --checkin-interval string   How often to post cluster status
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-h, --help help for clusterstatus
--kubeconfig string kubeconfig file for agent's cluster
--namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet-agent clusterstatus

Continuously report resource status to the upstream cluster

fleet-agent clusterstatus [flags]

Options

      --checkin-interval string   How often to post cluster status
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-h, --help help for clusterstatus
--kubeconfig string kubeconfig file for agent's cluster
--namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-agent/fleet-agent_register.html b/0.10/cli/fleet-agent/fleet-agent_register.html index 3155be77d..08e6085c8 100644 --- a/0.10/cli/fleet-agent/fleet-agent_register.html +++ b/0.10/cli/fleet-agent/fleet-agent_register.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet-agent register

Register agent with an upstream cluster

fleet-agent register [flags]

Options

      --debug               Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-h, --help help for register
--kubeconfig string kubeconfig file for agent's cluster
--namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet-agent register

Register agent with an upstream cluster

fleet-agent register [flags]

Options

      --debug               Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-h, --help help for register
--kubeconfig string kubeconfig file for agent's cluster
--namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-cli/fleet.html b/0.10/cli/fleet-cli/fleet.html index 49356b787..16daadf6e 100644 --- a/0.10/cli/fleet-cli/fleet.html +++ b/0.10/cli/fleet-cli/fleet.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet

fleet [flags]

Options

  -h, --help   help for fleet

SEE ALSO

  • fleet apply - Create bundles from directories, and output them or apply them on a cluster
  • fleet cleanup - Clean up outdated cluster registrations
  • fleet deploy - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.
  • fleet gitcloner - Clones a git repository
  • fleet target - Print available targets for a bundle
- +
Skip to main content
Version: 0.10

fleet

fleet [flags]

Options

  -h, --help   help for fleet

SEE ALSO

  • fleet apply - Create bundles from directories, and output them or apply them on a cluster
  • fleet cleanup - Clean up outdated cluster registrations
  • fleet deploy - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.
  • fleet gitcloner - Clones a git repository
  • fleet target - Print available targets for a bundle
+ \ No newline at end of file diff --git a/0.10/cli/fleet-cli/fleet_apply.html b/0.10/cli/fleet-cli/fleet_apply.html index 96ce08ea4..92a881abf 100644 --- a/0.10/cli/fleet-cli/fleet_apply.html +++ b/0.10/cli/fleet-cli/fleet_apply.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet apply

Create bundles from directories, and output them or apply them on a cluster

fleet apply [flags] BUNDLE_NAME PATH...

Options

  -b, --bundle-file string                     Location of the raw Bundle resource yaml
--cacerts-file string Path of custom cacerts for helm repo
--commit string Commit to assign to the bundle
-c, --compress Force all resources to be compress
--context string kubeconfig context for authentication
--correct-drift Rollback any change made from outside of Fleet
--correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated
--correct-drift-keep-fail-history Keep helm history for failed rollbacks
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-f, --file string Location of the fleet.yaml
--helm-credentials-by-path-file string Path of file containing helm credentials for paths
--helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided
-h, --help help for apply
--keep-resources Keep resources created after the GitRepo or Bundle is deleted
-k, --kubeconfig string kubeconfig for authentication
-l, --label strings Labels to apply to created bundles
-n, --namespace string namespace (default "fleet-local")
-o, --output string Output contents to file or - for stdout
--password-file string Path of file containing basic auth password for helm repo
--paused Create bundles in a paused state
-a, --service-account string Service account to assign to bundle created
--ssh-privatekey-file string Path of ssh-private-key for helm repo
--sync-generation int Generation number used to force sync the deployment
--target-namespace string Ensure this bundle goes to this target namespace
--targets-file string Addition source of targets and restrictions to be append
--username string Basic auth username for helm repo

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet apply

Create bundles from directories, and output them or apply them on a cluster

fleet apply [flags] BUNDLE_NAME PATH...

Options

  -b, --bundle-file string                     Location of the raw Bundle resource yaml
--cacerts-file string Path of custom cacerts for helm repo
--commit string Commit to assign to the bundle
-c, --compress Force all resources to be compress
--context string kubeconfig context for authentication
--correct-drift Rollback any change made from outside of Fleet
--correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated
--correct-drift-keep-fail-history Keep helm history for failed rollbacks
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
-f, --file string Location of the fleet.yaml
--helm-credentials-by-path-file string Path of file containing helm credentials for paths
--helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided
-h, --help help for apply
--keep-resources Keep resources created after the GitRepo or Bundle is deleted
-k, --kubeconfig string kubeconfig for authentication
-l, --label strings Labels to apply to created bundles
-n, --namespace string namespace (default "fleet-local")
-o, --output string Output contents to file or - for stdout
--password-file string Path of file containing basic auth password for helm repo
--paused Create bundles in a paused state
-a, --service-account string Service account to assign to bundle created
--ssh-privatekey-file string Path of ssh-private-key for helm repo
--sync-generation int Generation number used to force sync the deployment
--target-namespace string Ensure this bundle goes to this target namespace
--targets-file string Addition source of targets and restrictions to be append
--username string Basic auth username for helm repo

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-cli/fleet_cleanup.html b/0.10/cli/fleet-cli/fleet_cleanup.html index 3d9bc4a27..387305bc0 100644 --- a/0.10/cli/fleet-cli/fleet_cleanup.html +++ b/0.10/cli/fleet-cli/fleet_cleanup.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet cleanup

Clean up outdated cluster registrations

fleet cleanup [flags]

Options

      --context string      kubeconfig context for authentication
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
--factor string Factor to increase delay between deletes (default: 1.1)
-h, --help help for cleanup
-k, --kubeconfig string kubeconfig for authentication
--max string Maximum delay between deletes (default: 5s)
--min string Minimum delay between deletes (default: 10ms)
-n, --namespace string namespace (default "fleet-local")

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet cleanup

Clean up outdated cluster registrations

fleet cleanup [flags]

Options

      --context string      kubeconfig context for authentication
--debug Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
--factor string Factor to increase delay between deletes (default: 1.1)
-h, --help help for cleanup
-k, --kubeconfig string kubeconfig for authentication
--max string Maximum delay between deletes (default: 5s)
--min string Minimum delay between deletes (default: 10ms)
-n, --namespace string namespace (default "fleet-local")

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-cli/fleet_deploy.html b/0.10/cli/fleet-cli/fleet_deploy.html index e9a43827f..fd90576b5 100644 --- a/0.10/cli/fleet-cli/fleet_deploy.html +++ b/0.10/cli/fleet-cli/fleet_deploy.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet deploy

Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.

fleet deploy [flags]

Options

  -a, --agent-namespace string            Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.
-d, --dry-run Print the resources that would be deployed, but do not actually deploy them
-h, --help help for deploy
-i, --input-file string Location of the YAML file containing the content and the bundledeployment resource
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
-n, --namespace string Set the default namespace. Deploy helm chart into this namespace.
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet deploy

Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.

fleet deploy [flags]

Options

  -a, --agent-namespace string            Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.
-d, --dry-run Print the resources that would be deployed, but do not actually deploy them
-h, --help help for deploy
-i, --input-file string Location of the YAML file containing the content and the bundledeployment resource
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
-n, --namespace string Set the default namespace. Deploy helm chart into this namespace.
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-cli/fleet_gitcloner.html b/0.10/cli/fleet-cli/fleet_gitcloner.html index d1512b740..0f5e5876e 100644 --- a/0.10/cli/fleet-cli/fleet_gitcloner.html +++ b/0.10/cli/fleet-cli/fleet_gitcloner.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet gitcloner

Clones a git repository

fleet gitcloner [REPO] [PATH] [flags]

Options

  -b, --branch string                 git branch
--ca-bundle-file string CA bundle file
-h, --help help for gitcloner
--insecure-skip-tls do not verify tls certificates
--known-hosts-file string known hosts file
--password-file string password file for basic auth
--revision string git revision
--ssh-private-key-file string ssh private key file path
-u, --username string user name for basic auth

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet gitcloner

Clones a git repository

fleet gitcloner [REPO] [PATH] [flags]

Options

  -b, --branch string                 git branch
--ca-bundle-file string CA bundle file
-h, --help help for gitcloner
--insecure-skip-tls do not verify tls certificates
--known-hosts-file string known hosts file
--password-file string password file for basic auth
--revision string git revision
--ssh-private-key-file string ssh private key file path
-u, --username string user name for basic auth

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-cli/fleet_target.html b/0.10/cli/fleet-cli/fleet_target.html index fbc2be3c1..3c24b4b04 100644 --- a/0.10/cli/fleet-cli/fleet_target.html +++ b/0.10/cli/fleet-cli/fleet_target.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet target

Print available targets for a bundle

fleet target [flags]

Options

  -b, --bundle-file string                Location of the Bundle resource yaml
-l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML
-h, --help help for target
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
-n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet target

Print available targets for a bundle

fleet target [flags]

Options

  -b, --bundle-file string                Location of the Bundle resource yaml
-l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML
-h, --help help for target
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
-n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-cli/fleet_test.html b/0.10/cli/fleet-cli/fleet_test.html index 9068329c7..2b173d8c4 100644 --- a/0.10/cli/fleet-cli/fleet_test.html +++ b/0.10/cli/fleet-cli/fleet_test.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleet test

Match a bundle to a target and render the output (deprecated)

fleet test [flags]

Options

  -b, --bundle-file string    Location of the raw Bundle resource yaml
-f, --file string Location of the fleet.yaml
-g, --group string Cluster group to match against
-L, --group-label strings Cluster group labels to match against
-h, --help help for test
-l, --label strings Cluster labels to match against
-N, --name string Cluster name to match against
-q, --quiet Just print the match and don't print the resources
-t, --target string Explicit target to match

SEE ALSO

- +
Skip to main content
Version: 0.10

fleet test

Match a bundle to a target and render the output (deprecated)

fleet test [flags]

Options

  -b, --bundle-file string    Location of the raw Bundle resource yaml
-f, --file string Location of the fleet.yaml
-g, --group string Cluster group to match against
-L, --group-label strings Cluster group labels to match against
-h, --help help for test
-l, --label strings Cluster labels to match against
-N, --name string Cluster name to match against
-q, --quiet Just print the match and don't print the resources
-t, --target string Explicit target to match

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-controller/fleetcontroller.html b/0.10/cli/fleet-controller/fleetcontroller.html index cee010081..18151f152 100644 --- a/0.10/cli/fleet-controller/fleetcontroller.html +++ b/0.10/cli/fleet-controller/fleetcontroller.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleetcontroller

fleetcontroller [flags]

Options

      --debug                             Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
--disable-metrics disable metrics
-h, --help help for fleetcontroller
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
--namespace string namespace to watch (default "cattle-fleet-system")
--shard-id string only manage resources labeled with a specific shard ID
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

- +
Skip to main content
Version: 0.10

fleetcontroller

fleetcontroller [flags]

Options

      --debug                             Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
--disable-metrics disable metrics
-h, --help help for fleetcontroller
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
--namespace string namespace to watch (default "cattle-fleet-system")
--shard-id string only manage resources labeled with a specific shard ID
--zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
--zap-encoder encoder Zap log encoding (one of 'json' or 'console')
--zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
--zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
--zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-controller/fleetcontroller_agentmanagement.html b/0.10/cli/fleet-controller/fleetcontroller_agentmanagement.html index eb465892f..4662f8764 100644 --- a/0.10/cli/fleet-controller/fleetcontroller_agentmanagement.html +++ b/0.10/cli/fleet-controller/fleetcontroller_agentmanagement.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleetcontroller agentmanagement

fleetcontroller agentmanagement [flags]

Options

      --disable-bootstrap   disable local cluster components
-h, --help help for agentmanagement
--kubeconfig string kubeconfig file
--namespace string namespace to watch

Options inherited from parent commands

      --debug             Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X

SEE ALSO

- +
Skip to main content
Version: 0.10

fleetcontroller agentmanagement

fleetcontroller agentmanagement [flags]

Options

      --disable-bootstrap   disable local cluster components
-h, --help help for agentmanagement
--kubeconfig string kubeconfig file
--namespace string namespace to watch

Options inherited from parent commands

      --debug             Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-controller/fleetcontroller_cleanup.html b/0.10/cli/fleet-controller/fleetcontroller_cleanup.html index f0a757df1..521d4dcd6 100644 --- a/0.10/cli/fleet-controller/fleetcontroller_cleanup.html +++ b/0.10/cli/fleet-controller/fleetcontroller_cleanup.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleetcontroller cleanup

fleetcontroller cleanup [flags]

Options

  -h, --help                help for cleanup
--kubeconfig string kubeconfig file
--namespace string namespace to watch

Options inherited from parent commands

      --debug             Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X

SEE ALSO

- +
Skip to main content
Version: 0.10

fleetcontroller cleanup

fleetcontroller cleanup [flags]

Options

  -h, --help                help for cleanup
--kubeconfig string kubeconfig file
--namespace string namespace to watch

Options inherited from parent commands

      --debug             Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cli/fleet-controller/fleetcontroller_gitjob.html b/0.10/cli/fleet-controller/fleetcontroller_gitjob.html index 860918778..8ddfae0d1 100644 --- a/0.10/cli/fleet-controller/fleetcontroller_gitjob.html +++ b/0.10/cli/fleet-controller/fleetcontroller_gitjob.html @@ -4,13 +4,13 @@ Fleet - +
-
Skip to main content
Version: 0.10

fleetcontroller gitjob

fleetcontroller gitjob [flags]

Options

      --debug                         Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
--gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")
-h, --help help for gitjob
--kubeconfig string Kubeconfig file
--leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.
--listen string The port the webhook listens. (default ":8080")
--metrics-bind-address string The address the metric endpoint binds to. (default ":8081")
--namespace string namespace to watch (default "cattle-fleet-system")

Options inherited from parent commands

      --disable-metrics   disable metrics
--shard-id string only manage resources labeled with a specific shard ID
--shard-node-selector string node selector to apply to jobs based on the shard ID, if any

SEE ALSO

- +
Skip to main content
Version: 0.10

fleetcontroller gitjob

fleetcontroller gitjob [flags]

Options

      --debug                         Turn on debug logging
--debug-level int If debugging is enabled, set klog -v=X
--gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")
-h, --help help for gitjob
--kubeconfig string Kubeconfig file
--leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.
--listen string The port the webhook listens. (default ":8080")
--metrics-bind-address string The address the metric endpoint binds to. (default ":8081")
--namespace string namespace to watch (default "cattle-fleet-system")

Options inherited from parent commands

      --disable-metrics   disable metrics
--shard-id string only manage resources labeled with a specific shard ID
--shard-node-selector string node selector to apply to jobs based on the shard ID, if any

SEE ALSO

+ \ No newline at end of file diff --git a/0.10/cluster-bundles-state.html b/0.10/cluster-bundles-state.html index 3e70fc2a0..353989cec 100644 --- a/0.10/cluster-bundles-state.html +++ b/0.10/cluster-bundles-state.html @@ -4,13 +4,13 @@ Cluster and Bundle State | Fleet - +
-
Skip to main content
Version: 0.10

Cluster and Bundle State

Clusters and Bundles have different states in each phase of applying Bundles.

Bundles

Ready: Bundles have been deployed and all resources are ready.

NotReady: Bundles have been deployed and some resources are not ready.

WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

Pending: Bundles are being processed by Fleet controller.

Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

Clusters

WaitCheckIn: Waiting for agent to report registration information and cluster status back.

NotReady: There are bundles in this cluster that are in NotReady state.

WaitApplied: There are bundles in this cluster that are in WaitApplied state.

ErrApplied: There are bundles in this cluster that are in ErrApplied state.

OutOfSync: There are bundles in this cluster that are in OutOfSync state.

Pending: There are bundles in this cluster that are in Pending state.

Modified: There are bundles in this cluster that are in Modified state.

Ready: Bundles in this cluster have been deployed and all resources are ready.

- +
Skip to main content
Version: 0.10

Cluster and Bundle State

Clusters and Bundles have different states in each phase of applying Bundles.

Bundles

Ready: Bundles have been deployed and all resources are ready.

NotReady: Bundles have been deployed and some resources are not ready.

WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

Pending: Bundles are being processed by Fleet controller.

Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

Clusters

WaitCheckIn: Waiting for agent to report registration information and cluster status back.

NotReady: There are bundles in this cluster that are in NotReady state.

WaitApplied: There are bundles in this cluster that are in WaitApplied state.

ErrApplied: There are bundles in this cluster that are in ErrApplied state.

OutOfSync: There are bundles in this cluster that are in OutOfSync state.

Pending: There are bundles in this cluster that are in Pending state.

Modified: There are bundles in this cluster that are in Modified state.

Ready: Bundles in this cluster have been deployed and all resources are ready.

+ \ No newline at end of file diff --git a/0.10/cluster-group.html b/0.10/cluster-group.html index b68a435ca..1f7a046ad 100644 --- a/0.10/cluster-group.html +++ b/0.10/cluster-group.html @@ -4,7 +4,7 @@ Create Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

A cluster group is created by creating a ClusterGroup resource like below

kind: ClusterGroup
apiVersion: fleet.cattle.io/v1alpha1
metadata:
name: production-group
namespace: clusters
spec:
# This is the standard metav1.LabelSelector format to match clusters by labels
selector:
matchLabels:
env: prod
- +status of the deployments and then also a simpler way to manage targets.

A cluster group is created by creating a ClusterGroup resource like below

kind: ClusterGroup
apiVersion: fleet.cattle.io/v1alpha1
metadata:
name: production-group
namespace: clusters
spec:
# This is the standard metav1.LabelSelector format to match clusters by labels
selector:
matchLabels:
env: prod
+ \ No newline at end of file diff --git a/0.10/cluster-registration.html b/0.10/cluster-registration.html index ff667b487..303ba4632 100644 --- a/0.10/cluster-registration.html +++ b/0.10/cluster-registration.html @@ -4,7 +4,7 @@ Register Downstream Clusters | Fleet - + @@ -75,8 +75,8 @@ above example one can run the following one-liner:

info

If you are using Fleet standalone without Rancher, it must be installed as described in installation details.

The manager-initiated registration is used when you add a cluster from the Rancher dashboard.

Create Kubeconfig Secret

The format of this secret is intended to match the format of the kubeconfig secret used in cluster-api. -This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

Kubeconfig Secret Example
kind: Secret
apiVersion: v1
metadata:
name: my-cluster-kubeconfig
namespace: clusters
data:
value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

Create Cluster Resource

The cluster resource needs to reference the kubeconfig secret.

Cluster Resource Example
apiVersion: fleet.cattle.io/v1alpha1
kind: Cluster
metadata:
name: my-cluster
namespace: clusters
labels:
demo: "true"
env: dev
spec:
kubeConfigSecret: my-cluster-kubeconfig
- +This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

Kubeconfig Secret Example
kind: Secret
apiVersion: v1
metadata:
name: my-cluster-kubeconfig
namespace: clusters
data:
value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

Create Cluster Resource

The cluster resource needs to reference the kubeconfig secret.

Cluster Resource Example
apiVersion: fleet.cattle.io/v1alpha1
kind: Cluster
metadata:
name: my-cluster
namespace: clusters
labels:
demo: "true"
env: dev
spec:
kubeConfigSecret: my-cluster-kubeconfig
+ \ No newline at end of file diff --git a/0.10/concepts.html b/0.10/concepts.html index 55623a6ca..a91ffce64 100644 --- a/0.10/concepts.html +++ b/0.10/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/0.10/gitrepo-add.html b/0.10/gitrepo-add.html index 8c4d9f8dc..658e3a193 100644 --- a/0.10/gitrepo-add.html +++ b/0.10/gitrepo-add.html @@ -4,7 +4,7 @@ Create a GitRepo Resource | Fleet - + @@ -15,8 +15,8 @@ Make sure you don't leak credentials by mixing public and private repositor or split them into different gitrepos, or use helmRepoURLRegex to limit the scope of credentials to certain servers.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Use different helm credentials for each path

    info

    gitRepo.spec.helmSecretName will be ignored if gitRepo.spec.helmSecretNameForPaths is provided

    Create a file secrets-path.yaml that contains credentials for each path defined in a GitRepo. Credentials will not be used for paths that are not present in this file. The path is the actual path to the bundle (ie to a folder containing a fleet.yaml file) within the git repository, which might have more segments than the entry under paths:.

    Example:

    path-one: # path path-one must exist in the repository
    username: user
    password: pass
    path-two: # path path-one must exist in the repository
    username: user2
    password: pass2
    caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
    sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K

    Create the secret

    kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml

    In the previous example credentials for username user will be used for the path path-one and credentials for username -user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/0.10/gitrepo-content.html b/0.10/gitrepo-content.html index 320458756..fb5cc7b87 100644 --- a/0.10/gitrepo-content.html +++ b/0.10/gitrepo-content.html @@ -4,7 +4,7 @@ Git Repository Contents | Fleet - + @@ -53,8 +53,8 @@ will target deployment.yaml. The patch will be applied using JSON Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    Nested GitRepo CRs

    Nested GitRepo CRs (defining a GitRepo that points to a repository containing one or more GitRepo resources) is supported. You can use this feature to take advantage of GitOps in your GitRepo resources or, for example, to split complex scenarios into more than one GitRepo resource. -When finding a GitRepo in a Bundle Fleet will simply deploy it as any other resource.

    See this example.

    - +When finding a GitRepo in a Bundle Fleet will simply deploy it as any other resource.

    See this example.

    + \ No newline at end of file diff --git a/0.10/gitrepo-targets.html b/0.10/gitrepo-targets.html index 26d429157..ec509d599 100644 --- a/0.10/gitrepo-targets.html +++ b/0.10/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -23,8 +23,8 @@ and add clusters to it.

    this issue for more details.

  • Helm.WaitForJobs

  • Kustomize.Dir

  • YAML.Overlays

  • Diff.ComparePatches

  • Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/0.10/imagescan.html b/0.10/imagescan.html index b33026f72..29ebb3513 100644 --- a/0.10/imagescan.html +++ b/0.10/imagescan.html @@ -4,7 +4,7 @@ Using Image Scan to Update Container Image References | Fleet - + @@ -12,8 +12,8 @@
    Skip to main content
    Version: 0.10

    Using Image Scan to Update Container Image References

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    note

    Semver will ignore pre-release versions (for example, 0.0.1-10) unless a pre-release version is explicitly used in the range definition. For example, the "*" range will ignore pre-releases while ">= 0.0.1-10" will take them into account.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/0.10/installation.html b/0.10/installation.html index 156513eab..491306d7e 100644 --- a/0.10/installation.html +++ b/0.10/installation.html @@ -4,7 +4,7 @@ Installation Details | Fleet - + @@ -47,8 +47,8 @@ the ca.pem is not correct. The contents of the $API_SERVER_CA and the CA certificate is in the file ca.pem. If your API server URL is signed by a well-known CA you can omit the apiServerCA parameter below or just create an empty ca.pem file (ie touch ca.pem).

    Setup the environment with your specific values, e.g.:

    API_SERVER_URL="https://example.com:6443"
    API_SERVER_CA="ca.pem"

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First add Fleet's Helm repository.
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Second install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd

    Third install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="$API_SERVER_URL" \
    --set-file apiServerCA="$API_SERVER_CA" \
    fleet

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/0.10/multi-user.html b/0.10/multi-user.html index 5c4ea9fb7..557230cdd 100644 --- a/0.10/multi-user.html +++ b/0.10/multi-user.html @@ -4,7 +4,7 @@ Setup Multi User | Fleet - + @@ -18,8 +18,8 @@ users are only restricted to namespaces, but namespaces don't provide much isolation on their own. E.g. they can still consume as many resources as they like.

    However, the existing Fleet restrictions allow users to share clusters, and deploy resources without conflicts.

    Example Fleet Standalone

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Example Fleet in Rancher

    When a new fleet workspace is created, a corresponding namespace with an identical name is automatically generated within the Rancher local cluster. -For a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:

    Let's grant permissions to deploy fleet resources in the project1 and project2 fleet workspaces:

    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project1
    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project2
    apiVersion: management.cattle.io/v3
    kind: GlobalRole
    metadata:
    name: fleet-projects1and2
    namespacedRules:
    project1:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    project2:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    rules:
    - apiGroups:
    - management.cattle.io
    resourceNames:
    - project1
    - project2
    resources:
    - fleetworkspaces
    verbs:
    - '*'

    Assign the GlobalRole to users or groups, more info can be found in the Rancher docs

    The user now has access to the Continuous Delivery tab in Rancher and can deploy resources to both the project1 and project2 workspaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    - +For a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:

    Let's grant permissions to deploy fleet resources in the project1 and project2 fleet workspaces:

    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project1
    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project2
    apiVersion: management.cattle.io/v3
    kind: GlobalRole
    metadata:
    name: fleet-projects1and2
    namespacedRules:
    project1:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    project2:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    rules:
    - apiGroups:
    - management.cattle.io
    resourceNames:
    - project1
    - project2
    resources:
    - fleetworkspaces
    verbs:
    - '*'

    Assign the GlobalRole to users or groups, more info can be found in the Rancher docs

    The user now has access to the Continuous Delivery tab in Rancher and can deploy resources to both the project1 and project2 workspaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    + \ No newline at end of file diff --git a/0.10/namespaces.html b/0.10/namespaces.html index 521c80abf..bcd2d08ad 100644 --- a/0.10/namespaces.html +++ b/0.10/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -39,8 +39,8 @@ in an error state and won't be deployed.

    This can also be used to set If an allowedTargetNamespaces restriction is present, all GitRepos must specify a targetNamespace and the specified namespace must be in the allow list. -This also prevents the creation of cluster wide resources.

    - +This also prevents the creation of cluster wide resources.

    + \ No newline at end of file diff --git a/0.10/quickstart.html b/0.10/quickstart.html index afcc323e0..38379752f 100644 --- a/0.10/quickstart.html +++ b/0.10/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Skip to main content
    Version: 0.10

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is fairly straightforward. To install the Helm 3 CLI follow the official install instructions.

    Fleet in Rancher

    Rancher has separate helm charts for Fleet and uses a different repository.

    brew install helm
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
    helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet

    Add a Git Repo to Watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/0.10/ref-bundle-stages.html b/0.10/ref-bundle-stages.html index c3bca9392..97b22ca1d 100644 --- a/0.10/ref-bundle-stages.html +++ b/0.10/ref-bundle-stages.html @@ -4,13 +4,13 @@ Bundle Lifecycle | Fleet - +
    -
    Skip to main content
    Version: 0.10

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    Examining the Bundle Lifecycle With the CLI

    Several fleet CLI commands help with debugging bundles.

    fleet apply

    Apply renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource.

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/

    More information on how to create bundles with fleet apply can be found in the section on bundles.

    fleet target

    Target reads a bundle from a file and works with a live cluster to print out the bundledeployment & content resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.

    fleet deploy

    Deploy takes the output of fleet target, or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment.

    The deploy command can be used to bring bundles to air-gapped clusters.

    Lifecycle CLI Example

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    # for information about apply see https://fleet.rancher.io/bundle-add
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/
    fleet target --bundle-file bundle.yaml --list-inputs > bd.yaml
    fleet deploy --input-file bd.yaml --dry-run
    - +
    Skip to main content
    Version: 0.10

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    Examining the Bundle Lifecycle With the CLI

    Several fleet CLI commands help with debugging bundles.

    fleet apply

    Apply renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource.

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/

    More information on how to create bundles with fleet apply can be found in the section on bundles.

    fleet target

    Target reads a bundle from a file and works with a live cluster to print out the bundledeployment & content resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.

    fleet deploy

    Deploy takes the output of fleet target, or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment.

    The deploy command can be used to bring bundles to air-gapped clusters.

    Lifecycle CLI Example

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    # for information about apply see https://fleet.rancher.io/bundle-add
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/
    fleet target --bundle-file bundle.yaml --list-inputs > bd.yaml
    fleet deploy --input-file bd.yaml --dry-run
    + \ No newline at end of file diff --git a/0.10/ref-bundle.html b/0.10/ref-bundle.html index dad164091..c527a36f5 100644 --- a/0.10/ref-bundle.html +++ b/0.10/ref-bundle.html @@ -4,14 +4,14 @@ Bundle Resource | Fleet - +
    Skip to main content
    Version: 0.10

    Bundle Resource

    Bundles are automatically created by Fleet when a GitRepo is created.

    The content of the resource corresponds to the BundleSpec. -For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    - +For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    + \ No newline at end of file diff --git a/0.10/ref-configuration.html b/0.10/ref-configuration.html index 0456a62c8..fc6055919 100644 --- a/0.10/ref-configuration.html +++ b/0.10/ref-configuration.html @@ -4,7 +4,7 @@ Configuration | Fleet - + @@ -14,8 +14,8 @@ Fleet to resources, inherited from a GitRepo, which determines whic resource will not be processed.

    Annotations

    Annotations used by fleet:

    Fleet agent configuration

    Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a Cluster, see Registering Downstream Cluster for more info on how to create Clusters. Default configuration will be used if these fields are not provided.

    If you change the resources limits, make sure the limits allow the fleet-agent to work normally.

    Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults. -Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    - +Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    + \ No newline at end of file diff --git a/0.10/ref-crds.html b/0.10/ref-crds.html index cf8a2bc73..73f8f42b7 100644 --- a/0.10/ref-crds.html +++ b/0.10/ref-crds.html @@ -4,13 +4,13 @@ Custom Resources Spec | Fleet - +
    -
    Skip to main content
    Version: 0.10

    Custom Resources Spec

    Sub Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.

    When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleList

    BundleList contains a list of Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Bundletrue

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    contentsIdContentsID stores the contents id when deploying contents using an OCI registry.stringfalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    ociReferenceOCIReference is the OCI reference used to store contents, this is only for informational purposes.stringfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true
    resourcesSha256SumResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources fieldstringfalse

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentList

    BundleDeploymentList contains a list of BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleDeploymenttrue

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    deleteNamespaceDeleteNamespace can be used to delete the deployed namespace when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse
    deleteCRDResourcesDeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources.boolfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    ociContentsOCIContents is true when this deployment's contents is stored in an oci registryboolfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse
    disableDNSDisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to true by default.boolfalse
    skipSchemaValidationSkipSchemaValidation allows skipping schema validation against the chart valuesboolfalse
    disableDependencyUpdateDisableDependencyUpdate allows skipping chart dependencies updateboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleNamespaceMappingList

    BundleNamespaceMappingList contains a list of BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleNamespaceMappingtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterList

    ClusterList contains a list of Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Clustertrue

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap.stringfalse
    kubeConfigSecretNamespaceKubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]corev1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]corev1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*corev1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*corev1.ResourceRequirementsfalse
    hostNetworkHostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration).*boolfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentHostNetworkAgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used.boolfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    agentTLSModeAgentTLSMode supports two values: system-store and strict. If set to system-store, instructs the agent to trust CA bundles from the operating system's store. If set to strict, then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse
    garbageCollectionIntervalGarbageCollectionInterval determines how often agents clean up obsolete Helm releases.*metav1.Durationfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupList

    ClusterGroupList contains a list of ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterGrouptrue

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationList

    ClusterRegistrationList contains a list of ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationtrue

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenList

    ClusterRegistrationTokenList contains a list of ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationTokentrue

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse
    sha256sumSHA256Sum of the Content fieldstringfalse

    Back to Custom Resources

    ContentList

    ContentList contains a list of Content

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Contenttrue

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoList

    GitRepoList contains a list of GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepotrue

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    deleteNamespaceDeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    disablePollingDisables git polling. When enabled only webhooks will be used.boolfalse
    ociRegistryOCIRegistry specifies the OCI registry related parameters*OCIRegistrySpecfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    updateGenerationUpdate generation is the force update generation if spec.forceSyncGeneration is setint64false
    commitCommit is the Git commit hash from the last git job run.stringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last Git job run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse
    lastPollingTriggeredLastPollingTime is the last time the polling check was triggeredmetav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    OCIRegistrySpec

    FieldDescriptionSchemeRequired
    referenceReference of the OCI Registrystringfalse
    authSecretNameAuthSecretName contains the auth secret where the OCI regristry credentials are stored.stringfalse
    basicHTTPBasicHTTP uses HTTP connections to the OCI registry when enabled.boolfalse
    insecureSkipTLSInsecureSkipTLS allows connections to OCI registry without certs when enabled.boolfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    GitRepoRestrictionList

    GitRepoRestrictionList contains a list of GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepoRestrictiontrue

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanList

    ImageScanList contains a list of ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ImageScantrue

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    FleetYAML

    FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle.

    FieldDescriptionSchemeRequired
    nameName of the bundle which will be created.stringfalse
    labelsLabels are copied to the bundle and can be used in a dependsOn.selector.map[string]stringfalse
    BundleSpecBundleSpecfalse
    targetCustomizationsTargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster.[]BundleTargetfalse
    imageScansImageScans are optional and used to update container image references in the git repo.[]ImageScanYAMLfalse
    overrideTargetsOverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo.[]GitTargetfalse

    Back to Custom Resources

    ImageScanYAML

    ImageScanYAML is a single entry in the ImageScan list from fleet.yaml.

    FieldDescriptionSchemeRequired
    nameName of the image scan. Unused.stringfalse
    ImageScanSpecImageScanSpecfalse

    Back to Custom Resources

    - +
    Skip to main content
    Version: 0.10

    Custom Resources Spec

    Sub Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.

    When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleList

    BundleList contains a list of Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Bundletrue

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    contentsIdContentsID stores the contents id when deploying contents using an OCI registry.stringfalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    ociReferenceOCIReference is the OCI reference used to store contents, this is only for informational purposes.stringfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true
    resourcesSha256SumResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources fieldstringfalse

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentList

    BundleDeploymentList contains a list of BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleDeploymenttrue

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    deleteNamespaceDeleteNamespace can be used to delete the deployed namespace when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse
    deleteCRDResourcesDeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources.boolfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    ociContentsOCIContents is true when this deployment's contents is stored in an oci registryboolfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse
    disableDNSDisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to true by default.boolfalse
    skipSchemaValidationSkipSchemaValidation allows skipping schema validation against the chart valuesboolfalse
    disableDependencyUpdateDisableDependencyUpdate allows skipping chart dependencies updateboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleNamespaceMappingList

    BundleNamespaceMappingList contains a list of BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleNamespaceMappingtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterList

    ClusterList contains a list of Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Clustertrue

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap.stringfalse
    kubeConfigSecretNamespaceKubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]corev1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]corev1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*corev1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*corev1.ResourceRequirementsfalse
    hostNetworkHostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration).*boolfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentHostNetworkAgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used.boolfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    agentTLSModeAgentTLSMode supports two values: system-store and strict. If set to system-store, instructs the agent to trust CA bundles from the operating system's store. If set to strict, then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse
    garbageCollectionIntervalGarbageCollectionInterval determines how often agents clean up obsolete Helm releases.*metav1.Durationfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupList

    ClusterGroupList contains a list of ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterGrouptrue

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationList

    ClusterRegistrationList contains a list of ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationtrue

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenList

    ClusterRegistrationTokenList contains a list of ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationTokentrue

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse
    sha256sumSHA256Sum of the Content fieldstringfalse

    Back to Custom Resources

    ContentList

    ContentList contains a list of Content

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Contenttrue

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoList

    GitRepoList contains a list of GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepotrue

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    deleteNamespaceDeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    disablePollingDisables git polling. When enabled only webhooks will be used.boolfalse
    ociRegistryOCIRegistry specifies the OCI registry related parameters*OCIRegistrySpecfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    updateGenerationUpdate generation is the force update generation if spec.forceSyncGeneration is setint64false
    commitCommit is the Git commit hash from the last git job run.stringfalse
    webhookCommitWebhookCommit is the latest Git commit hash received from a webhookstringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last Git job run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse
    lastPollingTriggeredLastPollingTime is the last time the polling check was triggeredmetav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    OCIRegistrySpec

    FieldDescriptionSchemeRequired
    referenceReference of the OCI Registrystringfalse
    authSecretNameAuthSecretName contains the auth secret where the OCI regristry credentials are stored.stringfalse
    basicHTTPBasicHTTP uses HTTP connections to the OCI registry when enabled.boolfalse
    insecureSkipTLSInsecureSkipTLS allows connections to OCI registry without certs when enabled.boolfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    GitRepoRestrictionList

    GitRepoRestrictionList contains a list of GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepoRestrictiontrue

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanList

    ImageScanList contains a list of ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ImageScantrue

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    FleetYAML

    FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle.

    FieldDescriptionSchemeRequired
    nameName of the bundle which will be created.stringfalse
    labelsLabels are copied to the bundle and can be used in a dependsOn.selector.map[string]stringfalse
    BundleSpecBundleSpecfalse
    targetCustomizationsTargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster.[]BundleTargetfalse
    imageScansImageScans are optional and used to update container image references in the git repo.[]ImageScanYAMLfalse
    overrideTargetsOverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo.[]GitTargetfalse

    Back to Custom Resources

    ImageScanYAML

    ImageScanYAML is a single entry in the ImageScan list from fleet.yaml.

    FieldDescriptionSchemeRequired
    nameName of the image scan. Unused.stringfalse
    ImageScanSpecImageScanSpecfalse

    Back to Custom Resources

    + \ No newline at end of file diff --git a/0.10/ref-fleet-yaml.html b/0.10/ref-fleet-yaml.html index 1d53baeea..cefeb8807 100644 --- a/0.10/ref-fleet-yaml.html +++ b/0.10/ref-fleet-yaml.html @@ -4,7 +4,7 @@ fleet.yaml | Fleet - + @@ -25,8 +25,8 @@ library are available.

    Note that if the functions output changes with bundle will get redeployed.

    The template context has the following keys:

    To access Labels or Annotations by their key name:

    ${ get .ClusterLabels "management.cattle.io/cluster-display-name" }

    Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims, unlike Helm which uses {{ }}. These fleet.yaml template delimiters can be -escaped using backticks, eg.:

    foo-bar-${`${PWD}`}

    will result in the following text:

    foo-bar-${PWD}
    - +escaped using backticks, eg.:

    foo-bar-${`${PWD}`}

    will result in the following text:

    foo-bar-${PWD}
    + \ No newline at end of file diff --git a/0.10/ref-gitrepo.html b/0.10/ref-gitrepo.html index f0f6374f4..bb63e8f53 100644 --- a/0.10/ref-gitrepo.html +++ b/0.10/ref-gitrepo.html @@ -4,14 +4,14 @@ GitRepo Resource | Fleet - +
    Skip to main content
    Version: 0.10

    GitRepo Resource

    The GitRepo resource describes git repositories, how to access them and where the bundles are located.

    The content of the resource corresponds to the GitRepoSpec. -For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private git repository you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key

    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret

    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*

    # Contains the auth secret for private Helm repository for each path.
    # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)
    #
    # helmSecretNameForPaths: multi-helm-secret

    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle

    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true

    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # When disablePolling is set to true the git repo won't be checked periodically.
    # It will rely on webhooks only.
    # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)
    # disablePolling: false

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...

    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    - +For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private git repository you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key

    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret

    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*

    # Contains the auth secret for private Helm repository for each path.
    # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)
    #
    # helmSecretNameForPaths: multi-helm-secret

    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle

    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true

    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # When disablePolling is set to true the git repo won't be checked periodically.
    # It will rely on webhooks only.
    # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)
    # disablePolling: false

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...

    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    + \ No newline at end of file diff --git a/0.10/ref-registration.html b/0.10/ref-registration.html index 2fe61bd45..9b57af2fc 100644 --- a/0.10/ref-registration.html +++ b/0.10/ref-registration.html @@ -4,7 +4,7 @@ Cluster Registration Internals | Fleet - + @@ -21,8 +21,8 @@ cluster, the server values also exist in the kubeconfig secret, referenced by the Cluster resource. In this case the kubeconfig secret contains the upstream server URL and CA, next to the downstream's kubeconfig. If the settings are present in the kubeconfig secret, they -override the configured values.

    Registration Secrets

    Fleet Cluster Registration in Rancher

    Rancher installs the fleet helm chart. The API server URL and CA are derived from Rancher's settings.

    Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller.

    Import Cluster into Rancher

    When the user runs curl | kubectl apply, the applied manifest includes the rancher agent deployment.

    The deployment contains a secret cattle-credentials- which contains the API URL and a token.

    The Rancher agent starts up and reports downstream's kubeconfig to upstream.

    Rancher then creates the fleet Cluster resource, which references a kubeconfig secret.

    👉Fleet will use this kubeconfig to deploy the agent on the downstream cluster.

    - +override the configured values.

    Registration Secrets

    Fleet Cluster Registration in Rancher

    Rancher installs the fleet helm chart. The API server URL and CA are derived from Rancher's settings.

    Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller.

    Import Cluster into Rancher

    When the user runs curl | kubectl apply, the applied manifest includes the rancher agent deployment.

    The deployment contains a secret cattle-credentials- which contains the API URL and a token.

    The Rancher agent starts up and reports downstream's kubeconfig to upstream.

    Rancher then creates the fleet Cluster resource, which references a kubeconfig secret.

    👉Fleet will use this kubeconfig to deploy the agent on the downstream cluster.

    + \ No newline at end of file diff --git a/0.10/ref-resources.html b/0.10/ref-resources.html index 7529b29ad..7550acdf0 100644 --- a/0.10/ref-resources.html +++ b/0.10/ref-resources.html @@ -4,13 +4,13 @@ List of Deployed Resources | Fleet - +
    -
    Skip to main content
    Version: 0.10

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    - +
    Skip to main content
    Version: 0.10

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    + \ No newline at end of file diff --git a/0.10/resource-counts-and-resources-list.html b/0.10/resource-counts-and-resources-list.html index 7746f84a0..e734d16f6 100644 --- a/0.10/resource-counts-and-resources-list.html +++ b/0.10/resource-counts-and-resources-list.html @@ -4,13 +4,13 @@ Resources List | Fleet - +
    -
    Skip to main content
    Version: 0.10

    Resources List

    This document outlines the deployed resources, categorized under Bundles and GitRepos.

    Bundles

    The deployed resources within bundles can be found in status.ResourceKey. This key represents the actual resources deployed via bundleDeployments.

    GitRepos

    Similar to bundles, the deployed resources in GitRepos are listed in status.Resources. This list is also derived from bundleDeployments.

    Resource Counts

    GitRepos

    The status.ResourceCounts list for GitRepos is derived from bundleDeployments.

    Clusters

    In Clusters, the status.ResourceCounts list is derived from GitRepos.

    ClusterGroups

    In ClusterGroups, the status.ResourceCounts list is also derived from GitRepos.

    - +
    Skip to main content
    Version: 0.10

    Resources List

    This document outlines the deployed resources, categorized under Bundles and GitRepos.

    Bundles

    The deployed resources within bundles can be found in status.ResourceKey. This key represents the actual resources deployed via bundleDeployments.

    GitRepos

    Similar to bundles, the deployed resources in GitRepos are listed in status.Resources. This list is also derived from bundleDeployments.

    Resource Counts

    GitRepos

    The status.ResourceCounts list for GitRepos is derived from bundleDeployments.

    Clusters

    In Clusters, the status.ResourceCounts list is derived from GitRepos.

    ClusterGroups

    In ClusterGroups, the status.ResourceCounts list is also derived from GitRepos.

    + \ No newline at end of file diff --git a/0.10/resources-during-deployment.html b/0.10/resources-during-deployment.html index d3df0e5ed..dfa6dca4e 100644 --- a/0.10/resources-during-deployment.html +++ b/0.10/resources-during-deployment.html @@ -4,13 +4,13 @@ Custom Resources During Deployment | Fleet - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.10/troubleshooting.html b/0.10/troubleshooting.html index 24dbae520..42401565f 100644 --- a/0.10/troubleshooting.html +++ b/0.10/troubleshooting.html @@ -4,7 +4,7 @@ Troubleshooting | Fleet - + @@ -12,8 +12,8 @@
    Skip to main content
    Version: 0.10

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Fetch detailed status from GitRepos and Bundles?

    For debugging and bug reports the raw JSON of the resources status fields is most useful. This can be accessed in the Rancher UI, or through kubectl:

    kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}
    kubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority"

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name>
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Agent is no longer registered

    You can force a redeployment of an agent for a given cluster by setting redeployAgentGeneration.

    kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p '[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]'

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    Bundle failed to deploy: "resource already exists" Error

    If your bundle encounters the following error message during deployment:

    not installed: rendered manifests contain a resource that already
    exists. Unable to continue with install: ClusterRole "grafana-clusterrole"
    in namespace "" exists and cannot be imported into the current release: invalid
    ownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"
    must equal "ns-2": current value is "ns-1"

    This error occurs because a Helm resource with the same releaseName already exists in the cluster. To resolve this issue, you need to change the releaseName of the resource you want to create to avoid the conflict.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    Bundle failed to deploy: "resource already exists" Error

    If your bundle encounters the following error message during deployment:

    not installed: rendered manifests contain a resource that already
    exists. Unable to continue with install: ClusterRole "grafana-clusterrole"
    in namespace "" exists and cannot be imported into the current release: invalid
    ownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"
    must equal "ns-2": current value is "ns-1"

    This error occurs because a Helm resource with the same releaseName already exists in the cluster. To resolve this issue, you need to change the releaseName of the resource you want to create to avoid the conflict.

    + \ No newline at end of file diff --git a/0.10/tut-deployment.html b/0.10/tut-deployment.html index 2b2683bde..9d8773f81 100644 --- a/0.10/tut-deployment.html +++ b/0.10/tut-deployment.html @@ -4,7 +4,7 @@ Creating a Deployment | Fleet - + @@ -13,8 +13,8 @@ For more details on the options that are available per Git repository see Adding a GitRepo.

    Single-Cluster Examples

    All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet.

    An example using Helm. We are deploying the helm example to the local cluster.

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment:

    fleet.yaml
    namespace: fleet-helm-example

    # Custom helm options
    helm:
    # The release name to use. If empty a generated release name will be used
    releaseName: guestbook

    # The directory of the chart in the repo. Also any valid go-getter supported
    # URL can be used there is specify where to download the chart from.
    # If repo below is set this value if the chart name in the repo
    chart: ""

    # An https to a valid Helm repository to download the chart from
    repo: ""

    # Used if repo is set to look up the version of the chart
    version: ""

    # Force recreate resource that can not be updated
    force: false

    # How long for helm to wait for the release to be active. If the value
    # is less that or equal to zero, we will not wait in Helm
    timeoutSeconds: 0

    # Custom values that will be passed as values.yaml to the installation
    values:
    replicas: 2

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-local namespace contains the local cluster resource. The local fleet-agent will create the deployment in the fleet-helm-example namespace.

    kubectl apply -n fleet-local -f - <<EOF
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - single-cluster/helm
    EOF

    Multi-Cluster Examples

    The examples below will deploy a multi git repo to multiple clusters at once and configure the app differently for each target.

    An example using Helm. We are deploying the helm example and customizing it per target cluster

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment. The fleet.yaml is used to configure different deployment options, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-helm-example
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/helm
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod

    By applying the gitrepo resource to the upstream cluster, fleet will start to monitor the repository and create deployments:

    kubectl apply -n fleet-default -f gitrepo.yaml
    - +The application will be customized as follows per environment:

    The fleet.yaml is used to control which 'yaml' overlays are used, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-manifest-example
    targetCustomizations:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev
    yaml:
    overlays:
    # Refers to overlays/noreplication folder
    - noreplication

    - name: test
    clusterSelector:
    matchLabels:
    env: test
    yaml:
    overlays:
    # Refers to overlays/scale3 folder
    - scale3

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    yaml:
    # Refers to overlays/servicelb, scale3 folders
    overlays:
    - servicelb
    - scale3

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: manifests
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/manifests
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    kubectl apply -n fleet-default -f gitrepo.yaml
    + \ No newline at end of file diff --git a/0.10/uninstall.html b/0.10/uninstall.html index 2757c8399..56af99d03 100644 --- a/0.10/uninstall.html +++ b/0.10/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - +
    Skip to main content
    - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    caution

    Uninstalling the CRDs will remove all deployed workloads.

    + \ No newline at end of file diff --git a/0.10/webhook.html b/0.10/webhook.html index aa290be92..f85cc8fa1 100644 --- a/0.10/webhook.html +++ b/0.10/webhook.html @@ -4,15 +4,15 @@ Using Webhooks Instead of Polling | Fleet - +
    Skip to main content
    Version: 0.10

    Using Webhooks Instead of Polling

    By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).

    For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling.

    Fleet currently supports Azure DevOps, GitHub, GitLab, Bitbucket, Bitbucket Server, and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80

    If you want to have the webhook available using the same host name as your Rancher or another service, you can use the following YAML with the URL http://your.domain.com/gitjob. The below YAML is specific for the Nginx Ingress Controller:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /gitjob(/|$)(.*)
    pathType: ImplementationSpecific
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs
    Azure DevOpsazure-username
    Azure DevOpsazure-password

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    For Azure DevOps:

    • Enable basic authentication in Azure
    • Create a secret containing the credentials for the basic authentication
    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs
    Azure DevOpsazure-username
    Azure DevOpsazure-password

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    For Azure DevOps:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file diff --git a/0.4.html b/0.4.html index 0cd7bb2d9..9fae88563 100644 --- a/0.4.html +++ b/0.4.html @@ -4,13 +4,13 @@ Overview | Fleet - +
    -
    Skip to main content
    Version: 0.4

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    - +
    Skip to main content
    Version: 0.4

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    + \ No newline at end of file diff --git a/0.4/advanced-users.html b/0.4/advanced-users.html index 770ec0cd2..7b06a9224 100644 --- a/0.4/advanced-users.html +++ b/0.4/advanced-users.html @@ -4,13 +4,13 @@ Advanced Users | Fleet - +
    -
    Skip to main content
    Version: 0.4

    Advanced Users

    Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.

    The following are examples of advanced use cases:

    Please refer to the installation and the uninstall documentation for additional information.

    - +
    Skip to main content
    Version: 0.4

    Advanced Users

    Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.

    The following are examples of advanced use cases:

    Please refer to the installation and the uninstall documentation for additional information.

    + \ No newline at end of file diff --git a/0.4/agent-initiated.html b/0.4/agent-initiated.html index 34e95c7ff..af7ba9dde 100644 --- a/0.4/agent-initiated.html +++ b/0.4/agent-initiated.html @@ -4,7 +4,7 @@ Agent Initiated | Fleet - + @@ -39,8 +39,8 @@ For the agent chart the namespace must be cattle-fleet-system and t Helm will use the default context in ${HOME}/.kube/config to deploy the agent. Use --kubeconfig and --kube-context to change which cluster Helm is installing to.

    Finally, install the agent using Helm.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set clientID="$CLUSTER_CLIENT_ID" \
    --values values.yaml \
    fleet-agent https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-agent-v0.4.1.tgz

    The agent should now be deployed. You can check that status of the fleet pods by running the below commands.

    # Ensure kubectl is pointing to the right cluster
    kubectl -n cattle-fleet-system logs -l app=fleet-agent
    kubectl -n cattle-fleet-system get pods -l app=fleet-agent

    Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster was registered in the clusters namespace. Please ensure your ${HOME}/.kube/config is pointed to the Fleet -manager to run this command.

    kubectl -n clusters get clusters.fleet.cattle.io
    NAME                   BUNDLES-READY   NODES-READY   SAMPLE-NODE             LAST-SEEN              STATUS
    my-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z
    - +manager to run this command.

    kubectl -n clusters get clusters.fleet.cattle.io
    NAME                   BUNDLES-READY   NODES-READY   SAMPLE-NODE             LAST-SEEN              STATUS
    my-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z
    + \ No newline at end of file diff --git a/0.4/architecture.html b/0.4/architecture.html index 90061aea4..84af3fa60 100644 --- a/0.4/architecture.html +++ b/0.4/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

    The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

    - +subresource of it's Cluster resource.

    + \ No newline at end of file diff --git a/0.4/bundle-diffs.html b/0.4/bundle-diffs.html index 6e1224543..7116eb4f1 100644 --- a/0.4/bundle-diffs.html +++ b/0.4/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs for Modified GitRepos | Fleet - +
    Skip to main content
    Version: 0.4

    Generating Diffs for Modified GitRepos

    Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

    You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

    The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

    This leads the status of the bundle and associated GitRepo to be reported as "Modified"

    Associated Bundle -

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    - +

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    + \ No newline at end of file diff --git a/0.4/changelogs.html b/0.4/changelogs.html index efc966d04..1c1e9d33c 100644 --- a/0.4/changelogs.html +++ b/0.4/changelogs.html @@ -4,13 +4,13 @@ 0.4 Changelogs | Fleet - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.4/changelogs/changelogs/v0.4.0.html b/0.4/changelogs/changelogs/v0.4.0.html index 089df3a7a..2257907db 100644 --- a/0.4/changelogs/changelogs/v0.4.0.html +++ b/0.4/changelogs/changelogs/v0.4.0.html @@ -4,13 +4,13 @@ Fleet v0.4.0 | Fleet - +
    -
    Skip to main content
    Version: 0.4

    Fleet v0.4.0

    • (rancherio-gh-m) released this 2022-10-13 16:38:56 +0000 UTC*

    Description

    Additions

    • Added the ability to utilize Helm atomic when installing and upgrading.
    • Added an RBAC rule for leases.coordination.k8s.io in the Gitjob chart.

    Note: due to an issue in the fleet agent, when a bundle fails to install properly the agent goes into a cycle of repeatedly trying to reinstall. This happens when atomic is set or there is an error with installing the bundle for another reason. This is the cause of issue #499 and is being worked on.

    Note: due to an issue in the fleet controller the presence of a clusterregistrationtoken resource can lead to a higher than normal CPU load. The token expiry time is not updated correctly. The issue is fixed in the next version of fleet.

    Bug Fixes

    • Fixed an issue where the fleet agent can continuously delete resources

    Changes

    • Added CI testing to Gitjob
    • Updated dependencies (Go modules and base container images)
    • Updated to a newer version of the Tekton components used by Fleet
    • Updated builds to Go 1.18
    • Updated the base container images to use SLE BCI

    Download

    Information retrieved from here

    - +
    Skip to main content
    Version: 0.4

    Fleet v0.4.0

    • (rancherio-gh-m) released this 2022-10-13 16:38:56 +0000 UTC*

    Description

    Additions

    • Added the ability to utilize Helm atomic when installing and upgrading.
    • Added an RBAC rule for leases.coordination.k8s.io in the Gitjob chart.

    Note: due to an issue in the fleet agent, when a bundle fails to install properly the agent goes into a cycle of repeatedly trying to reinstall. This happens when atomic is set or there is an error with installing the bundle for another reason. This is the cause of issue #499 and is being worked on.

    Note: due to an issue in the fleet controller the presence of a clusterregistrationtoken resource can lead to a higher than normal CPU load. The token expiry time is not updated correctly. The issue is fixed in the next version of fleet.

    Bug Fixes

    • Fixed an issue where the fleet agent can continuously delete resources

    Changes

    • Added CI testing to Gitjob
    • Updated dependencies (Go modules and base container images)
    • Updated to a newer version of the Tekton components used by Fleet
    • Updated builds to Go 1.18
    • Updated the base container images to use SLE BCI

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.4/changelogs/changelogs/v0.4.1.html b/0.4/changelogs/changelogs/v0.4.1.html index 4c776801a..1706cbe6b 100644 --- a/0.4/changelogs/changelogs/v0.4.1.html +++ b/0.4/changelogs/changelogs/v0.4.1.html @@ -4,13 +4,13 @@ Fleet v0.4.1 | Fleet - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.4/cluster-bundles-state.html b/0.4/cluster-bundles-state.html index 569479d7e..2d1f9bb0e 100644 --- a/0.4/cluster-bundles-state.html +++ b/0.4/cluster-bundles-state.html @@ -4,13 +4,13 @@ Cluster and Bundle state | Fleet - +
    -
    Skip to main content
    Version: 0.4

    Cluster and Bundle state

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    - +
    Skip to main content
    Version: 0.4

    Cluster and Bundle state

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    + \ No newline at end of file diff --git a/0.4/cluster-group.html b/0.4/cluster-group.html index 0ed710d05..9b03d08ff 100644 --- a/0.4/cluster-group.html +++ b/0.4/cluster-group.html @@ -4,7 +4,7 @@ Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    - +status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    + \ No newline at end of file diff --git a/0.4/cluster-overview.html b/0.4/cluster-overview.html index f867e82dc..5d8cd6654 100644 --- a/0.4/cluster-overview.html +++ b/0.4/cluster-overview.html @@ -4,7 +4,7 @@ Overview | Fleet - + @@ -24,8 +24,8 @@ manager must be able to communicate with the downstream cluster API server for t After the cluster is registered there is no further need for the manager to contact the downstream cluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes clusters through GitOps using something like cluster-api -or Rancher.

    - +or Rancher.

    + \ No newline at end of file diff --git a/0.4/cluster-tokens.html b/0.4/cluster-tokens.html index cb773bba7..841d33a8d 100644 --- a/0.4/cluster-tokens.html +++ b/0.4/cluster-tokens.html @@ -4,7 +4,7 @@ Cluster Registration Tokens | Fleet - + @@ -26,8 +26,8 @@ are used in Fleet refer to the documentation on namesp token with the below YAML.

    kind: ClusterRegistrationToken
    apiVersion: "fleet.cattle.io/v1alpha1"
    metadata:
    name: new-token
    namespace: clusters
    spec:
    # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.
    ttl: 240h

    After the ClusterRegistrationToken is created, Fleet will create a corresponding Secret with the same name. As the Secret creation is performed asynchronously, you will need to wait until it's available before using it.

    One way to do so is via the following one-liner:

    while ! kubectl --namespace=clusters  get secret new-token; do sleep 5; done

    Obtaining Token Value (Agent values.yaml)

    The token value contains YAML content for a values.yaml file that is expected to be passed to helm install to install the Fleet agent on a downstream cluster.

    Such value is contained in the values field of the Secret mentioned above. To obtain the YAML content for the -above example one can run the following one-liner:

    kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml

    Once the values.yaml is ready it can be used repeatedly by clusters to register until the TTL expires.

    - +above example one can run the following one-liner:

    kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml

    Once the values.yaml is ready it can be used repeatedly by clusters to register until the TTL expires.

    + \ No newline at end of file diff --git a/0.4/concepts.html b/0.4/concepts.html index 4c7717958..e7b8ca5b5 100644 --- a/0.4/concepts.html +++ b/0.4/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/0.4/examples.html b/0.4/examples.html index 0fd2e4bd3..07e604221 100644 --- a/0.4/examples.html +++ b/0.4/examples.html @@ -4,14 +4,14 @@ Examples | Fleet - +
    Skip to main content
    Version: 0.4

    Examples

    Lifecycle of a Fleet Bundle

    To demonstrate the lifecycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    Deploy Kubernetes Manifests Across Clusters with Customization

    Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.

    To demonstrate how to deploy Kubernetes manifests across different clusters using Fleet, we will use multi-cluster/helm/fleet.yaml as a case study.

    Situation: User has three clusters with three different labels: env=dev, env=test, and env=prod. User wants to deploy a frontend application with a backend database across these clusters.

    Expected behavior:

    • After deploying to the dev cluster, database replication is not enabled.
    • After deploying to the test cluster, database replication is enabled.
    • After deploying to the prod cluster, database replication is enabled and Load balancer services are exposed.

    Advantage of Fleet:

    Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:

    1. Deploy gitRepo https://github.com/rancher/fleet-examples.git and specify the path multi-cluster/helm.
    2. Under multi-cluster/helm, a Helm chart will deploy the frontend app service and backend database service.
    3. The following rule will be defined in fleet.yaml:
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    Result:

    Fleet will deploy the Helm chart with your customized values.yaml to the different clusters.

    Note: Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.

    Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/0.4/gitrepo-add.html b/0.4/gitrepo-add.html index 19f6daf57..f16c3ee9b 100644 --- a/0.4/gitrepo-add.html +++ b/0.4/gitrepo-add.html @@ -4,15 +4,15 @@ Adding a GitRepo | Fleet - +
    Skip to main content
    Version: 0.4

    Adding a GitRepo

    Proper namespace

    Git repos are added to the Fleet manager using the GitRepo custom resource type. The GitRepo type is namespaced. By default, Rancher will create two Fleet workspaces: fleet-default and fleet-local.

    • Fleet-default will contain all the downstream clusters that are already registered through Rancher.
    • Fleet-local will contain the local cluster by default.

    If you are using Fleet in a single cluster style, the namespace will always be fleet-local. Check here for more on the fleet-local namespace.

    For a multi-cluster style, please ensure you use the correct repo that will map to the right target clusters.

    Create GitRepo instance

    Git repositories are register by creating a GitRepo following the below YAML sample. Refer to the inline comments as the means of each field

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    Adding Private Git Repository

    Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace.

    For example, to generate a private ssh key

    ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"

    Note: The private key format has to be in EC PRIVATE KEY, RSA PRIVATE KEY or PRIVATE KEY and should not contain a passphase.

    Put your private key into secret, use the namespace the GitRepo is in:

    kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key  --type=kubernetes.io/ssh-auth
    caution

    Private key with passphrase is not supported.

    caution

    The key has to be in PEM format.

    Fleet supports putting known_hosts into ssh secret. Here is an example of how to add it:

    Fetch the public key hash(take github as an example)

    ssh-keyscan -H github.com

    And add it into secret:

    apiVersion: v1
    kind: Secret
    metadata:
    name: ssh-key
    type: kubernetes.io/ssh-auth
    stringData:
    ssh-privatekey: <private-key>
    known_hosts: |-
    |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
    danger

    If you don't add it any server's public key will be trusted and added. (ssh -o stricthostkeychecking=accept-new will be used)

    info

    If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.

    Using HTTP Auth

    Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see HTTP secrets in Github.

    kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat

    Just like with SSH, reference the secret in your GitRepo resource via clientSecretName.

    spec:
    repo: https://github.com/fleetrepoci/gitjob-private.git
    branch: main
    clientSecretName: basic-auth-secret

    Using Private Helm Repositories

    danger

    The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource. -Make sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +Make sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/0.4/gitrepo-structure.html b/0.4/gitrepo-structure.html index 44bdb8948..168f0df0f 100644 --- a/0.4/gitrepo-structure.html +++ b/0.4/gitrepo-structure.html @@ -4,7 +4,7 @@ Expected Repo Structure | Fleet - + @@ -43,8 +43,8 @@ the contents a file the convention of adding _patch. (notice the tr will be replaced with . from the file name and that will be used as the target. For example deployment_patch.yaml will target deployment.yaml. The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch. Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written -using YAML syntax.

    Cluster and Bundle state

    See Cluster and Bundle state.

    - +using YAML syntax.

    Cluster and Bundle state

    See Cluster and Bundle state.

    + \ No newline at end of file diff --git a/0.4/gitrepo-targets.html b/0.4/gitrepo-targets.html index b27e58221..27678b811 100644 --- a/0.4/gitrepo-targets.html +++ b/0.4/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -18,8 +18,8 @@ One can use cluster selectors, cluster group selectors, or an explicit cluster g the final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the default value it is dropped from the criteria. The default value is either null or "". It is important to realize that the value {} for a selector means "match everything."

    # Match everything
    clusterSelector: {}
    # Selector ignored
    clusterSelector: null

    Default target

    If no target is set for the GitRepo then the default targets value is applied. The default targets value is as below.

    targets:
    - name: default
    clusterGroup: default

    This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default -and add clusters to it.

    - +and add clusters to it.

    + \ No newline at end of file diff --git a/0.4/imagescan.html b/0.4/imagescan.html index 3a92e5c0c..9eea16697 100644 --- a/0.4/imagescan.html +++ b/0.4/imagescan.html @@ -4,15 +4,15 @@ Image scan | Fleet - +
    Skip to main content
    Version: 0.4

    Image scan

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/0.4/installation.html b/0.4/installation.html index a47eb6678..c6821d492 100644 --- a/0.4/installation.html +++ b/0.4/installation.html @@ -4,7 +4,7 @@ Installation | Fleet - + @@ -13,8 +13,8 @@ Multi-Cluster install. The single cluster install is for if you wish to use GitOps to manage a single cluster, in which case you do not need a centralized manager cluster. In the multi-cluster use case you will setup a centralized manager cluster to which you can register clusters.

    If you are just learning Fleet the single cluster install is the recommended starting -point. After which you can move from single cluster to multi-cluster setup down the line.

    - +point. After which you can move from single cluster to multi-cluster setup down the line.

    + \ No newline at end of file diff --git a/0.4/manager-initiated.html b/0.4/manager-initiated.html index 25ae14ed4..e305db605 100644 --- a/0.4/manager-initiated.html +++ b/0.4/manager-initiated.html @@ -4,7 +4,7 @@ Manager Initiated | Fleet - + @@ -15,8 +15,8 @@ of the kubeconfig secret used in cluster-api. This means you can use cluster-api to create a cluster that is dynamically -registered with Fleet.

    Example

    Kubeconfig Secret

    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Cluster

    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    - +registered with Fleet.

    Example

    Kubeconfig Secret

    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Cluster

    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    + \ No newline at end of file diff --git a/0.4/multi-cluster-install.html b/0.4/multi-cluster-install.html index 691ef4745..110c12354 100644 --- a/0.4/multi-cluster-install.html +++ b/0.4/multi-cluster-install.html @@ -4,7 +4,7 @@ Multi-cluster Install | Fleet - + @@ -35,8 +35,8 @@ only because the curl command is not setting proper credentials, but this valida connection work and the ca.pem is correct for this URL. If you get a SSL certificate problem then the ca.pem is not correct. The contents of the ${API_SERVER_CA} file should look similar to the below

    -----BEGIN CERTIFICATE-----
    MIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2
    ZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda
    MCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49
    AgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E
    0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE
    AwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs
    ciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN
    KDs/pb3fnMTtpA==
    -----END CERTIFICATE-----

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz

    Second install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="${API_SERVER_URL}" \
    --set-file apiServerCA="${API_SERVER_CA}" \
    fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz

    Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/0.4/namespaces.html b/0.4/namespaces.html index b29260f5a..e68f5294e 100644 --- a/0.4/namespaces.html +++ b/0.4/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -35,8 +35,8 @@ be evaluated against all clusters in all namespaces that match namespaceSe bundles from git by putting labels in the fleet.yaml file or on the metadata.labels field on the GitRepo.

    Restricting GitRepos

    A namespace can contain multiple GitRepoRestriction resources. All GitRepos created in that namespace will be checked against the list of restrictions. If a GitRepo violates one of the constraints its BundleDeployment will be -in an error state and won't be deployed.

    This can also be used to set the defaults for GitRepo's serviceAccount and clientSecretName fields.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: typically-unique
    allowedClientSecretNames: []
    allowedRepoPatterns: []
    allowedServiceAccounts: []
    defaultClientSecretName: ""
    defaultServiceAccount: ""
    - +in an error state and won't be deployed.

    This can also be used to set the defaults for GitRepo's serviceAccount and clientSecretName fields.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: typically-unique
    allowedClientSecretNames: []
    allowedRepoPatterns: []
    allowedServiceAccounts: []
    defaultClientSecretName: ""
    defaultServiceAccount: ""
    + \ No newline at end of file diff --git a/0.4/quickstart.html b/0.4/quickstart.html index 1b2316935..01202ab0e 100644 --- a/0.4/quickstart.html +++ b/0.4/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Skip to main content
    Version: 0.4

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure things to your cluster.

    brew install helm

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-v0.4.1.tgz
    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-v0.4.1.tgz

    Add a Git Repo to watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/0.4/single-cluster-install.html b/0.4/single-cluster-install.html index 5d7377d28..9d7f8018b 100644 --- a/0.4/single-cluster-install.html +++ b/0.4/single-cluster-install.html @@ -4,7 +4,7 @@ Single Cluster Install | Fleet - + @@ -18,8 +18,8 @@ fairly straight forward. To install the Helm 3 CLI follow the official install instructions. The TL;DR is

    macOS

    brew install helm

    Windows

    choco install kubernetes-helm

    Kubernetes

    Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means 1.15 or greater.

    Install

    Install the following two Helm charts.

    First install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz

    Second install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz

    Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by -running the below commands.

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    You can now register some git repos in the fleet-local namespace to start deploying Kubernetes resources.

    - +running the below commands.

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    You can now register some git repos in the fleet-local namespace to start deploying Kubernetes resources.

    + \ No newline at end of file diff --git a/0.4/troubleshooting.html b/0.4/troubleshooting.html index f6a8f5de5..f597b4e97 100644 --- a/0.4/troubleshooting.html +++ b/0.4/troubleshooting.html @@ -4,15 +4,15 @@ Troubleshooting | Fleet - +
    Skip to main content
    Version: 0.4

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority" 

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name> 
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    + \ No newline at end of file diff --git a/0.4/uninstall.html b/0.4/uninstall.html index b9918d2de..6e8c4aa83 100644 --- a/0.4/uninstall.html +++ b/0.4/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - +
    Skip to main content
    Version: 0.4

    Uninstall

    Fleet is packaged as two Helm charts so uninstall is accomplished by uninstalling the appropriate Helm charts. To uninstall Fleet run the following -two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    + \ No newline at end of file diff --git a/0.4/webhook.html b/0.4/webhook.html index 45d026459..9740a3265 100644 --- a/0.4/webhook.html +++ b/0.4/webhook.html @@ -4,7 +4,7 @@ Webhook | Fleet - + @@ -12,8 +12,8 @@
    Skip to main content
    Version: 0.4

    Webhook

    By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file diff --git a/0.5.html b/0.5.html index 11a984506..4a7b61de5 100644 --- a/0.5.html +++ b/0.5.html @@ -4,13 +4,13 @@ Overview | Fleet - +
    -
    Skip to main content
    Version: 0.5

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    - +
    Skip to main content
    Version: 0.5

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    + \ No newline at end of file diff --git a/0.5/advanced-users.html b/0.5/advanced-users.html index fb50b5676..cee5d974c 100644 --- a/0.5/advanced-users.html +++ b/0.5/advanced-users.html @@ -4,13 +4,13 @@ Advanced Users | Fleet - +
    -
    Skip to main content
    Version: 0.5

    Advanced Users

    Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.

    The following are examples of advanced use cases:

    Please refer to the installation and the uninstall documentation for additional information.

    - +
    Skip to main content
    Version: 0.5

    Advanced Users

    Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.

    The following are examples of advanced use cases:

    Please refer to the installation and the uninstall documentation for additional information.

    + \ No newline at end of file diff --git a/0.5/agent-initiated.html b/0.5/agent-initiated.html index d7bbc8ef0..a0af926c4 100644 --- a/0.5/agent-initiated.html +++ b/0.5/agent-initiated.html @@ -4,7 +4,7 @@ Agent Initiated | Fleet - + @@ -39,8 +39,8 @@ For the agent chart the namespace must be cattle-fleet-system and t Helm will use the default context in ${HOME}/.kube/config to deploy the agent. Use --kubeconfig and --kube-context to change which cluster Helm is installing to.

    Finally, install the agent using Helm.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set clientID="$CLUSTER_CLIENT_ID" \
    --values values.yaml \
    fleet-agent https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz

    The agent should now be deployed. You can check that status of the fleet pods by running the below commands.

    # Ensure kubectl is pointing to the right cluster
    kubectl -n cattle-fleet-system logs -l app=fleet-agent
    kubectl -n cattle-fleet-system get pods -l app=fleet-agent

    Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster was registered in the clusters namespace. Please ensure your ${HOME}/.kube/config is pointed to the Fleet -manager to run this command.

    kubectl -n clusters get clusters.fleet.cattle.io
    NAME                   BUNDLES-READY   NODES-READY   SAMPLE-NODE             LAST-SEEN              STATUS
    my-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z
    - +manager to run this command.

    kubectl -n clusters get clusters.fleet.cattle.io
    NAME                   BUNDLES-READY   NODES-READY   SAMPLE-NODE             LAST-SEEN              STATUS
    my-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z
    + \ No newline at end of file diff --git a/0.5/architecture.html b/0.5/architecture.html index ab46094b5..a27702edf 100644 --- a/0.5/architecture.html +++ b/0.5/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

    The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

    - +subresource of it's Cluster resource.

    + \ No newline at end of file diff --git a/0.5/bundle-diffs.html b/0.5/bundle-diffs.html index 8b47c8440..cde4b5e87 100644 --- a/0.5/bundle-diffs.html +++ b/0.5/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs for Modified GitRepos | Fleet - +
    Skip to main content
    Version: 0.5

    Generating Diffs for Modified GitRepos

    Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

    You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

    The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

    This leads the status of the bundle and associated GitRepo to be reported as "Modified"

    Associated Bundle -

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    - +

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    + \ No newline at end of file diff --git a/0.5/changelogs.html b/0.5/changelogs.html index 3ccde15db..817d16a1c 100644 --- a/0.5/changelogs.html +++ b/0.5/changelogs.html @@ -4,13 +4,13 @@ 0.5 Changelogs | Fleet - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.5/changelogs/changelogs/v0.5.0.html b/0.5/changelogs/changelogs/v0.5.0.html index 450812749..f8248ab25 100644 --- a/0.5/changelogs/changelogs/v0.5.0.html +++ b/0.5/changelogs/changelogs/v0.5.0.html @@ -4,13 +4,13 @@ v0.5.0 | Fleet - +
    -
    Skip to main content
    Version: 0.5

    v0.5.0

    • (rancherio-gh-m) released this 2022-11-10 17:33:25 +0000 UTC*

    Description

    Additions

    • Add support for OCI registry based charts in #975
    • Adds priorityClassName to deployments in #983
    • Support cluster specific registry in #984, #1060
    • Add cluster labels to agent config creation

    Bug Fixes

    • Fix long bundle names in #964
    • Remove ignored fields from status struct, to avoid loop in #990
    • Fix for cluster registration token performance degradation in #998
    • Fix authentication for OCI images in #998
    • Stop requeuing on failed deployments in #1045

    Changes

    • Updating GitJob to 0.1.32 in #972
    • Setting the Kubernetes libs at 0.24.5 in #981
    • Bump bci/bci-base 15.4.27.11.23 in #989

    Full Changelog: v0.4.0...v0.5.0

    Download

    Information retrieved from here

    - +
    Skip to main content
    Version: 0.5

    v0.5.0

    • (rancherio-gh-m) released this 2022-11-10 17:33:25 +0000 UTC*

    Description

    Additions

    • Add support for OCI registry based charts in #975
    • Adds priorityClassName to deployments in #983
    • Support cluster specific registry in #984, #1060
    • Add cluster labels to agent config creation

    Bug Fixes

    • Fix long bundle names in #964
    • Remove ignored fields from status struct, to avoid loop in #990
    • Fix for cluster registration token performance degradation in #998
    • Fix authentication for OCI images in #998
    • Stop requeuing on failed deployments in #1045

    Changes

    • Updating GitJob to 0.1.32 in #972
    • Setting the Kubernetes libs at 0.24.5 in #981
    • Bump bci/bci-base 15.4.27.11.23 in #989

    Full Changelog: v0.4.0...v0.5.0

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.5/changelogs/changelogs/v0.5.1.html b/0.5/changelogs/changelogs/v0.5.1.html index 0968a4df7..56ff6f3d9 100644 --- a/0.5/changelogs/changelogs/v0.5.1.html +++ b/0.5/changelogs/changelogs/v0.5.1.html @@ -4,13 +4,13 @@ v0.5.1 | Fleet - + - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.5/changelogs/changelogs/v0.5.2.html b/0.5/changelogs/changelogs/v0.5.2.html index 3d7153efc..5deac13d8 100644 --- a/0.5/changelogs/changelogs/v0.5.2.html +++ b/0.5/changelogs/changelogs/v0.5.2.html @@ -4,13 +4,13 @@ v0.5.2 | Fleet - +
    -
    Skip to main content
    Version: 0.5

    v0.5.2

    • (rancherio-gh-m) released this 2023-02-23 08:01:03 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.5.0...v0.5.2

    Download

    Information retrieved from here

    - +
    Skip to main content
    Version: 0.5

    v0.5.2

    • (rancherio-gh-m) released this 2023-02-23 08:01:03 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.5.0...v0.5.2

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.5/changelogs/changelogs/v0.5.3.html b/0.5/changelogs/changelogs/v0.5.3.html index bd82b7551..8ff4450a0 100644 --- a/0.5/changelogs/changelogs/v0.5.3.html +++ b/0.5/changelogs/changelogs/v0.5.3.html @@ -4,13 +4,13 @@ v0.5.3 | Fleet - +
    -
    Skip to main content
    Version: 0.5

    v0.5.3

    • (rancherio-gh-m) released this 2023-03-06 15:56:56 +0000 UTC*

    Description

    Notes

    Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade.

    When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from fleet-system to cattle-fleet-system. This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover fleet-system namespaces. In older versions of fleet, it's possible to rancher/rancher#40127 (comment) into the new namespace, or to rancher/rancher#40127 (comment).

    Additions

    • Backport "Reading contents&secrets uses specific service account" by @thardeck in #1298

    Bugfixes

    What's Changed

    Full Changelog: v0.5.0...v0.5.3

    Download

    Information retrieved from here

    - +
    Skip to main content
    Version: 0.5

    v0.5.3

    • (rancherio-gh-m) released this 2023-03-06 15:56:56 +0000 UTC*

    Description

    Notes

    Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade.

    When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from fleet-system to cattle-fleet-system. This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover fleet-system namespaces. In older versions of fleet, it's possible to rancher/rancher#40127 (comment) into the new namespace, or to rancher/rancher#40127 (comment).

    Additions

    • Backport "Reading contents&secrets uses specific service account" by @thardeck in #1298

    Bugfixes

    What's Changed

    Full Changelog: v0.5.0...v0.5.3

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.5/cluster-bundles-state.html b/0.5/cluster-bundles-state.html index 0a63fab56..d81ec6a74 100644 --- a/0.5/cluster-bundles-state.html +++ b/0.5/cluster-bundles-state.html @@ -4,13 +4,13 @@ Cluster and Bundle state | Fleet - +
    -
    Skip to main content
    Version: 0.5

    Cluster and Bundle state

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    - +
    Skip to main content
    Version: 0.5

    Cluster and Bundle state

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    + \ No newline at end of file diff --git a/0.5/cluster-group.html b/0.5/cluster-group.html index 98da49c7c..7ad5d8443 100644 --- a/0.5/cluster-group.html +++ b/0.5/cluster-group.html @@ -4,7 +4,7 @@ Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    - +status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    + \ No newline at end of file diff --git a/0.5/cluster-overview.html b/0.5/cluster-overview.html index 5466c8bb3..de56f9a1d 100644 --- a/0.5/cluster-overview.html +++ b/0.5/cluster-overview.html @@ -4,7 +4,7 @@ Overview | Fleet - + @@ -24,8 +24,8 @@ manager must be able to communicate with the downstream cluster API server for t After the cluster is registered there is no further need for the manager to contact the downstream cluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes clusters through GitOps using something like cluster-api -or Rancher.

    - +or Rancher.

    + \ No newline at end of file diff --git a/0.5/cluster-tokens.html b/0.5/cluster-tokens.html index d934a52ba..2e3267307 100644 --- a/0.5/cluster-tokens.html +++ b/0.5/cluster-tokens.html @@ -4,7 +4,7 @@ Cluster Registration Tokens | Fleet - + @@ -26,8 +26,8 @@ are used in Fleet refer to the documentation on namesp token with the below YAML.

    kind: ClusterRegistrationToken
    apiVersion: "fleet.cattle.io/v1alpha1"
    metadata:
    name: new-token
    namespace: clusters
    spec:
    # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.
    ttl: 240h

    After the ClusterRegistrationToken is created, Fleet will create a corresponding Secret with the same name. As the Secret creation is performed asynchronously, you will need to wait until it's available before using it.

    One way to do so is via the following one-liner:

    while ! kubectl --namespace=clusters  get secret new-token; do sleep 5; done

    Obtaining Token Value (Agent values.yaml)

    The token value contains YAML content for a values.yaml file that is expected to be passed to helm install to install the Fleet agent on a downstream cluster.

    Such value is contained in the values field of the Secret mentioned above. To obtain the YAML content for the -above example one can run the following one-liner:

    kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml

    Once the values.yaml is ready it can be used repeatedly by clusters to register until the TTL expires.

    - +above example one can run the following one-liner:

    kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml

    Once the values.yaml is ready it can be used repeatedly by clusters to register until the TTL expires.

    + \ No newline at end of file diff --git a/0.5/concepts.html b/0.5/concepts.html index 24baf0d5f..4a191e4f8 100644 --- a/0.5/concepts.html +++ b/0.5/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/0.5/examples.html b/0.5/examples.html index 4ab88e8e9..95e171d91 100644 --- a/0.5/examples.html +++ b/0.5/examples.html @@ -4,14 +4,14 @@ Examples | Fleet - +
    Skip to main content
    Version: 0.5

    Examples

    Lifecycle of a Fleet Bundle

    To demonstrate the lifecycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    Deploy Kubernetes Manifests Across Clusters with Customization

    Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.

    To demonstrate how to deploy Kubernetes manifests across different clusters using Fleet, we will use multi-cluster/helm/fleet.yaml as a case study.

    Situation: User has three clusters with three different labels: env=dev, env=test, and env=prod. User wants to deploy a frontend application with a backend database across these clusters.

    Expected behavior:

    • After deploying to the dev cluster, database replication is not enabled.
    • After deploying to the test cluster, database replication is enabled.
    • After deploying to the prod cluster, database replication is enabled and Load balancer services are exposed.

    Advantage of Fleet:

    Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:

    1. Deploy gitRepo https://github.com/rancher/fleet-examples.git and specify the path multi-cluster/helm.
    2. Under multi-cluster/helm, a Helm chart will deploy the frontend app service and backend database service.
    3. The following rule will be defined in fleet.yaml:
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    Result:

    Fleet will deploy the Helm chart with your customized values.yaml to the different clusters.

    Note: Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.

    Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/0.5/gitrepo-add.html b/0.5/gitrepo-add.html index e8389731d..b3325c1e0 100644 --- a/0.5/gitrepo-add.html +++ b/0.5/gitrepo-add.html @@ -4,15 +4,15 @@ Adding a GitRepo | Fleet - +
    Skip to main content
    Version: 0.5

    Adding a GitRepo

    Proper namespace

    Git repos are added to the Fleet manager using the GitRepo custom resource type. The GitRepo type is namespaced. By default, Rancher will create two Fleet workspaces: fleet-default and fleet-local.

    • Fleet-default will contain all the downstream clusters that are already registered through Rancher.
    • Fleet-local will contain the local cluster by default.

    If you are using Fleet in a single cluster style, the namespace will always be fleet-local. Check here for more on the fleet-local namespace.

    For a multi-cluster style, please ensure you use the correct repo that will map to the right target clusters.

    Create GitRepo instance

    Git repositories are register by creating a GitRepo following the below YAML sample. Refer to the inline comments as the means of each field

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    Adding Private Git Repository

    Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace.

    For example, to generate a private ssh key

    ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"

    Note: The private key format has to be in EC PRIVATE KEY, RSA PRIVATE KEY or PRIVATE KEY and should not contain a passphase.

    Put your private key into secret, use the namespace the GitRepo is in:

    kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key  --type=kubernetes.io/ssh-auth
    caution

    Private key with passphrase is not supported.

    caution

    The key has to be in PEM format.

    Fleet supports putting known_hosts into ssh secret. Here is an example of how to add it:

    Fetch the public key hash(take github as an example)

    ssh-keyscan -H github.com

    And add it into secret:

    apiVersion: v1
    kind: Secret
    metadata:
    name: ssh-key
    type: kubernetes.io/ssh-auth
    stringData:
    ssh-privatekey: <private-key>
    known_hosts: |-
    |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
    danger

    If you don't add it any server's public key will be trusted and added. (ssh -o stricthostkeychecking=accept-new will be used)

    info

    If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.

    Using HTTP Auth

    Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see HTTP secrets in Github.

    kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat

    Just like with SSH, reference the secret in your GitRepo resource via clientSecretName.

    spec:
    repo: https://github.com/fleetrepoci/gitjob-private.git
    branch: main
    clientSecretName: basic-auth-secret

    Using Private Helm Repositories

    danger

    The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource. -Make sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +Make sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/0.5/gitrepo-structure.html b/0.5/gitrepo-structure.html index 71f177e3c..b774b5064 100644 --- a/0.5/gitrepo-structure.html +++ b/0.5/gitrepo-structure.html @@ -4,7 +4,7 @@ Expected Repo Structure | Fleet - + @@ -43,8 +43,8 @@ the contents a file the convention of adding _patch. (notice the tr will be replaced with . from the file name and that will be used as the target. For example deployment_patch.yaml will target deployment.yaml. The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch. Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written -using YAML syntax.

    Cluster and Bundle state

    See Cluster and Bundle state.

    - +using YAML syntax.

    Cluster and Bundle state

    See Cluster and Bundle state.

    + \ No newline at end of file diff --git a/0.5/gitrepo-targets.html b/0.5/gitrepo-targets.html index 749cb080d..df3c66a1d 100644 --- a/0.5/gitrepo-targets.html +++ b/0.5/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -18,8 +18,8 @@ One can use cluster selectors, cluster group selectors, or an explicit cluster g the final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the default value it is dropped from the criteria. The default value is either null or "". It is important to realize that the value {} for a selector means "match everything."

    # Match everything
    clusterSelector: {}
    # Selector ignored
    clusterSelector: null

    Default target

    If no target is set for the GitRepo then the default targets value is applied. The default targets value is as below.

    targets:
    - name: default
    clusterGroup: default

    This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default -and add clusters to it.

    - +and add clusters to it.

    + \ No newline at end of file diff --git a/0.5/imagescan.html b/0.5/imagescan.html index 4c3abd8d8..716c5c4d2 100644 --- a/0.5/imagescan.html +++ b/0.5/imagescan.html @@ -4,15 +4,15 @@ Image scan | Fleet - +
    Skip to main content
    Version: 0.5

    Image scan

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/0.5/installation.html b/0.5/installation.html index 5ed1dedf0..620e2bf69 100644 --- a/0.5/installation.html +++ b/0.5/installation.html @@ -4,7 +4,7 @@ Installation | Fleet - + @@ -13,8 +13,8 @@ Multi-Cluster install. The single cluster install is for if you wish to use GitOps to manage a single cluster, in which case you do not need a centralized manager cluster. In the multi-cluster use case you will setup a centralized manager cluster to which you can register clusters.

    If you are just learning Fleet the single cluster install is the recommended starting -point. After which you can move from single cluster to multi-cluster setup down the line.

    - +point. After which you can move from single cluster to multi-cluster setup down the line.

    + \ No newline at end of file diff --git a/0.5/manager-initiated.html b/0.5/manager-initiated.html index 254528780..b9dd35383 100644 --- a/0.5/manager-initiated.html +++ b/0.5/manager-initiated.html @@ -4,7 +4,7 @@ Manager Initiated | Fleet - + @@ -15,8 +15,8 @@ of the kubeconfig secret used in cluster-api. This means you can use cluster-api to create a cluster that is dynamically -registered with Fleet.

    Example

    Kubeconfig Secret

    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Cluster

    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    - +registered with Fleet.

    Example

    Kubeconfig Secret

    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Cluster

    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    + \ No newline at end of file diff --git a/0.5/multi-cluster-install.html b/0.5/multi-cluster-install.html index ebfc7ca7c..5f6a02cfb 100644 --- a/0.5/multi-cluster-install.html +++ b/0.5/multi-cluster-install.html @@ -4,7 +4,7 @@ Multi Cluster Install | Fleet - + @@ -35,8 +35,8 @@ only because the curl command is not setting proper credentials, but this valida connection work and the ca.pem is correct for this URL. If you get a SSL certificate problem then the ca.pem is not correct. The contents of the ${API_SERVER_CA} file should look similar to the below

    -----BEGIN CERTIFICATE-----
    MIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2
    ZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda
    MCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49
    AgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E
    0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE
    AwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs
    ciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN
    KDs/pb3fnMTtpA==
    -----END CERTIFICATE-----

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz

    Second install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="${API_SERVER_URL}" \
    --set-file apiServerCA="${API_SERVER_CA}" \
    fleet https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz

    Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/0.5/namespaces.html b/0.5/namespaces.html index df2fb3823..a88331250 100644 --- a/0.5/namespaces.html +++ b/0.5/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -35,8 +35,8 @@ be evaluated against all clusters in all namespaces that match namespaceSe bundles from git by putting labels in the fleet.yaml file or on the metadata.labels field on the GitRepo.

    Restricting GitRepos

    A namespace can contain multiple GitRepoRestriction resources. All GitRepos created in that namespace will be checked against the list of restrictions. If a GitRepo violates one of the constraints its BundleDeployment will be -in an error state and won't be deployed.

    This can also be used to set the defaults for GitRepo's serviceAccount and clientSecretName fields.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: typically-unique
    allowedClientSecretNames: []
    allowedRepoPatterns: []
    allowedServiceAccounts: []
    defaultClientSecretName: ""
    defaultServiceAccount: ""
    - +in an error state and won't be deployed.

    This can also be used to set the defaults for GitRepo's serviceAccount and clientSecretName fields.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: typically-unique
    allowedClientSecretNames: []
    allowedRepoPatterns: []
    allowedServiceAccounts: []
    defaultClientSecretName: ""
    defaultServiceAccount: ""
    + \ No newline at end of file diff --git a/0.5/quickstart.html b/0.5/quickstart.html index 5275d3b52..fdfab0072 100644 --- a/0.5/quickstart.html +++ b/0.5/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Skip to main content
    Version: 0.5

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure things to your cluster.

    brew install helm

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz
    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz

    Add a Git Repo to watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/0.5/single-cluster-install.html b/0.5/single-cluster-install.html index a6da825f1..9ac5eafbe 100644 --- a/0.5/single-cluster-install.html +++ b/0.5/single-cluster-install.html @@ -4,7 +4,7 @@ Single Cluster Install | Fleet - + @@ -18,8 +18,8 @@ fairly straight forward. To install the Helm 3 CLI follow the official install instructions. The TL;DR is

    macOS

    brew install helm

    Windows

    choco install kubernetes-helm

    Kubernetes

    Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means 1.15 or greater.

    Install

    Install the following two Helm charts.

    First install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz

    Second install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz

    Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by -running the below commands.

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    You can now register some git repos in the fleet-local namespace to start deploying Kubernetes resources.

    - +running the below commands.

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    You can now register some git repos in the fleet-local namespace to start deploying Kubernetes resources.

    + \ No newline at end of file diff --git a/0.5/troubleshooting.html b/0.5/troubleshooting.html index 260a83a26..c3d8cdbc9 100644 --- a/0.5/troubleshooting.html +++ b/0.5/troubleshooting.html @@ -4,15 +4,15 @@ Troubleshooting | Fleet - +
    Skip to main content
    Version: 0.5

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority" 

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name> 
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    + \ No newline at end of file diff --git a/0.5/uninstall.html b/0.5/uninstall.html index d403ff2ce..2341b9a15 100644 --- a/0.5/uninstall.html +++ b/0.5/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - +
    Skip to main content
    Version: 0.5

    Uninstall

    Fleet is packaged as two Helm charts so uninstall is accomplished by uninstalling the appropriate Helm charts. To uninstall Fleet run the following -two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    + \ No newline at end of file diff --git a/0.5/webhook.html b/0.5/webhook.html index d49bf4acc..da5d2c305 100644 --- a/0.5/webhook.html +++ b/0.5/webhook.html @@ -4,7 +4,7 @@ Webhook | Fleet - + @@ -12,8 +12,8 @@
    Skip to main content
    Version: 0.5

    Webhook

    By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file diff --git a/0.6.html b/0.6.html index 6effc6d93..b98694e89 100644 --- a/0.6.html +++ b/0.6.html @@ -4,13 +4,13 @@ Overview | Fleet - +
    -
    Skip to main content
    Version: 0.6

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    - +
    Skip to main content
    Version: 0.6

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    + \ No newline at end of file diff --git a/0.6/architecture.html b/0.6/architecture.html index e8fcfe579..3f927f4f6 100644 --- a/0.6/architecture.html +++ b/0.6/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

    The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    - +subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    + \ No newline at end of file diff --git a/0.6/bundle-diffs.html b/0.6/bundle-diffs.html index 755057c5d..157495614 100644 --- a/0.6/bundle-diffs.html +++ b/0.6/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs to Ignore Modified GitRepos | Fleet - +
    Skip to main content
    Version: 0.6

    Generating Diffs to Ignore Modified GitRepos

    Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

    You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

    The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

    This leads the status of the bundle and associated GitRepo to be reported as "Modified"

    Associated Bundle -

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    https://github.com/rancher/fleet-examples/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    - +

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    https://github.com/rancher/fleet-examples/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    + \ No newline at end of file diff --git a/0.6/changelogs.html b/0.6/changelogs.html index d3b2b1feb..72ae6befa 100644 --- a/0.6/changelogs.html +++ b/0.6/changelogs.html @@ -4,13 +4,13 @@ 0.6 Changelogs | Fleet - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.6/changelogs/changelogs/v0.6.0.html b/0.6/changelogs/changelogs/v0.6.0.html index 8a0f55102..a50c7d38e 100644 --- a/0.6/changelogs/changelogs/v0.6.0.html +++ b/0.6/changelogs/changelogs/v0.6.0.html @@ -4,13 +4,13 @@ v0.6.0 | Fleet - +
    -
    Skip to main content
    Version: 0.6

    v0.6.0

    • (rancherio-gh-m) released this 2023-04-05 13:35:35 +0000 UTC*

    Description

    Notes

    Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade.

    When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from fleet-system to cattle-fleet-system. This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover fleet-system namespaces. In older versions of fleet, it's possible to copy the agent config manually into the new namespace, or to trigger the agent redeployment manually.

    Additions

    • Add authentication support for OCI based Helm charts by @thardeck in #996
    • Support cluster repo change by @manno in #999
    • Apply gitrepo labels to bundles by @manno in #1007
    • Add allowedTargetNamespaces to GitRepoRestriction by @manno in #1008
    • Enforce presence of targetNamespace if gitreporestriction is present. by @manno in #1022
    • Cluster specific registry replaces global registry by @manno in #1053
    • Reading contents&secrets uses specific service account by @manno in #1063
    • Cluster values full templating by @manno in #1158
    • Helm Target Customization Repo/Version Override by @romejoe in #1011
    • Sprig Templating for Helm Values with Inputs from Cluster Resource by @rajiteh in #671
    • Add helmRepoUrlRegex to the GitRepo by @raulcabello in #1234

    Bugfixes

    What's Changed

    • Removing the docs directory by @mattfarina in #1014
    • Scripts for local testing with k3d by @manno in #1024
    • Debug statements for controllers by @manno in #1036
    • Scaling: make ClusterEnqueueDelay configurable via environment variable by @moio in #1071
    • Add nightly builds by @manno in #1075
    • Cluster registration debug messages and comments by @manno in #1095
    • Add support to continuous pprof CPU profiling by @moio in #1076
    • Split DEVELOPING.md into separate files in docs/ by @manno in #1134
    • Add CLI to generate reference docs by @manno in #1126
    • Allow to run longer before killing leader during debugging by @moio in #1137
    • Introduce parameter to debug controller but not agents by @moio in #1124
    • Fix CRD download url by @olblak in #1190
    • Add Github Action workflow to prevent manual changes to Gitjob or generated code by @thardeck in #1239
    • Fleet in Rancher Upgrade CI by @manno in #1198

    New Contributors

    Full Changelog: v0.5.0...v0.6.0

    Download

    Information retrieved from here

    - +
    Skip to main content
    Version: 0.6

    v0.6.0

    • (rancherio-gh-m) released this 2023-04-05 13:35:35 +0000 UTC*

    Description

    Notes

    Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade.

    When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from fleet-system to cattle-fleet-system. This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover fleet-system namespaces. In older versions of fleet, it's possible to copy the agent config manually into the new namespace, or to trigger the agent redeployment manually.

    Additions

    • Add authentication support for OCI based Helm charts by @thardeck in #996
    • Support cluster repo change by @manno in #999
    • Apply gitrepo labels to bundles by @manno in #1007
    • Add allowedTargetNamespaces to GitRepoRestriction by @manno in #1008
    • Enforce presence of targetNamespace if gitreporestriction is present. by @manno in #1022
    • Cluster specific registry replaces global registry by @manno in #1053
    • Reading contents&secrets uses specific service account by @manno in #1063
    • Cluster values full templating by @manno in #1158
    • Helm Target Customization Repo/Version Override by @romejoe in #1011
    • Sprig Templating for Helm Values with Inputs from Cluster Resource by @rajiteh in #671
    • Add helmRepoUrlRegex to the GitRepo by @raulcabello in #1234

    Bugfixes

    What's Changed

    • Removing the docs directory by @mattfarina in #1014
    • Scripts for local testing with k3d by @manno in #1024
    • Debug statements for controllers by @manno in #1036
    • Scaling: make ClusterEnqueueDelay configurable via environment variable by @moio in #1071
    • Add nightly builds by @manno in #1075
    • Cluster registration debug messages and comments by @manno in #1095
    • Add support to continuous pprof CPU profiling by @moio in #1076
    • Split DEVELOPING.md into separate files in docs/ by @manno in #1134
    • Add CLI to generate reference docs by @manno in #1126
    • Allow to run longer before killing leader during debugging by @moio in #1137
    • Introduce parameter to debug controller but not agents by @moio in #1124
    • Fix CRD download url by @olblak in #1190
    • Add Github Action workflow to prevent manual changes to Gitjob or generated code by @thardeck in #1239
    • Fleet in Rancher Upgrade CI by @manno in #1198

    New Contributors

    Full Changelog: v0.5.0...v0.6.0

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.6/cli/fleet-agent.html b/0.6/cli/fleet-agent.html index 296325734..ff5c7b3a2 100644 --- a/0.6/cli/fleet-agent.html +++ b/0.6/cli/fleet-agent.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Skip to main content
    Version: 0.6

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string        An identifier used to scope the agent bundleID names, typically the same as namespace
    --checkin-interval string How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch
    --simulators int Numbers of simulators to run
    - +
    Skip to main content
    Version: 0.6

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string        An identifier used to scope the agent bundleID names, typically the same as namespace
    --checkin-interval string How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch
    --simulators int Numbers of simulators to run
    + \ No newline at end of file diff --git a/0.6/cli/fleet-cli/fleet.html b/0.6/cli/fleet-cli/fleet.html index 1fc9bb629..d78e06969 100644 --- a/0.6/cli/fleet-cli/fleet.html +++ b/0.6/cli/fleet-cli/fleet.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Skip to main content
    Version: 0.6

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet test - Match a bundle to a target and render the output
    - +
    Skip to main content
    Version: 0.6

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet test - Match a bundle to a target and render the output
    + \ No newline at end of file diff --git a/0.6/cli/fleet-cli/fleet_apply.html b/0.6/cli/fleet-cli/fleet_apply.html index f907903b6..d506ad58b 100644 --- a/0.6/cli/fleet-cli/fleet_apply.html +++ b/0.6/cli/fleet-cli/fleet_apply.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Skip to main content
    Version: 0.6

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string           Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -h, --help help for apply
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Skip to main content
    Version: 0.6

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string           Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -h, --help help for apply
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.6/cli/fleet-cli/fleet_test.html b/0.6/cli/fleet-cli/fleet_test.html index a51bbf486..e9d5ffc8d 100644 --- a/0.6/cli/fleet-cli/fleet_test.html +++ b/0.6/cli/fleet-cli/fleet_test.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Skip to main content
    Version: 0.6

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Skip to main content
    Version: 0.6

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.6/cli/fleet-controller/fleet-manager.html b/0.6/cli/fleet-controller/fleet-manager.html index 390482da4..b3be58b49 100644 --- a/0.6/cli/fleet-controller/fleet-manager.html +++ b/0.6/cli/fleet-controller/fleet-manager.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Skip to main content
    Version: 0.6

    fleet-manager

    fleet-manager [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-bootstrap disable agent on local cluster
    --disable-gitops disable gitops components
    -h, --help help for fleet-manager
    --kubeconfig string Kubeconfig file
    --namespace string namespace to watch (default "cattle-fleet-system")
    - +
    Skip to main content
    Version: 0.6

    fleet-manager

    fleet-manager [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-bootstrap disable agent on local cluster
    --disable-gitops disable gitops components
    -h, --help help for fleet-manager
    --kubeconfig string Kubeconfig file
    --namespace string namespace to watch (default "cattle-fleet-system")
    + \ No newline at end of file diff --git a/0.6/cluster-bundles-state.html b/0.6/cluster-bundles-state.html index 49bf32a61..56025bb80 100644 --- a/0.6/cluster-bundles-state.html +++ b/0.6/cluster-bundles-state.html @@ -4,13 +4,13 @@ Cluster and Bundle State | Fleet - +
    -
    Skip to main content
    Version: 0.6

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    - +
    Skip to main content
    Version: 0.6

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    + \ No newline at end of file diff --git a/0.6/cluster-group.html b/0.6/cluster-group.html index b65953a47..0a2acb682 100644 --- a/0.6/cluster-group.html +++ b/0.6/cluster-group.html @@ -4,7 +4,7 @@ Create Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    - +status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    + \ No newline at end of file diff --git a/0.6/cluster-registration.html b/0.6/cluster-registration.html index 1210f8602..7bdce682f 100644 --- a/0.6/cluster-registration.html +++ b/0.6/cluster-registration.html @@ -4,7 +4,7 @@ Register Downstream Clusters | Fleet - + @@ -75,8 +75,8 @@ above example one can run the following one-liner:

    info

    If you are using Fleet standalone without Rancher, it must be installed as described in installation details.

    The manager-initiated registration is used when you add a cluster from the Rancher dashboard.

    Create Kubeconfig Secret

    The format of this secret is intended to match the format of the kubeconfig secret used in cluster-api. -This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    - +This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    + \ No newline at end of file diff --git a/0.6/concepts.html b/0.6/concepts.html index 798ce2c27..533427fe3 100644 --- a/0.6/concepts.html +++ b/0.6/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

    • To see the life cycle of a bundle, click here.
  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/0.6/gitrepo-add.html b/0.6/gitrepo-add.html index b1bf99bf1..a71c1513c 100644 --- a/0.6/gitrepo-add.html +++ b/0.6/gitrepo-add.html @@ -4,7 +4,7 @@ Create a GitRepo Resource | Fleet - + @@ -12,8 +12,8 @@
    Skip to main content
    Version: 0.6

    Create a GitRepo Resource

    Create GitRepo Instance

    Git repositories are registered by creating a GitRepo resource in Kubernetes. Refer to the creating a deployment tutorial for examples.

    The available fields are documented in the GitRepo resource reference

    Using Helm Values

    How changes are applied to values.yaml:

    • Note that the most recently applied changes to the values.yaml will override any previously existing values.

    • When changes are applied to the values.yaml from multiple sources at the same time, the values will update in the following order: helm.values -> helm.valuesFiles -> helm.valuesFrom. That means valuesFrom will take precedence over both, valuesFiles and values.

    Using ValuesFrom

    These examples showcase the style and format for using valuesFrom. ConfigMaps and Secrets should be created in downstream clusters.

    Example ConfigMap:

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: configmap-values
    namespace: default
    data:
    values.yaml: |-
    replication: true
    replicas: 2
    serviceType: NodePort

    Example Secret:

    apiVersion: v1
    kind: Secret
    metadata:
    name: secret-values
    namespace: default
    stringData:
    values.yaml: |-
    replication: true
    replicas: 3
    serviceType: NodePort

    A secret like that, can be created from a YAML file secretdata.yaml by running the following kubectl command: kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml

    The resources can then be referenced from a fleet.yaml:

    helm:
    chart: simple-chart
    valuesFrom:
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml
    - configMapKeyRef:
    name: configmap-values
    namespace: default
    key: values.yaml
    values:
    replicas: "4"

    Adding Private Git Repository

    Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace.

    For example, to generate a private ssh key

    ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"

    Note: The private key format has to be in EC PRIVATE KEY, RSA PRIVATE KEY or PRIVATE KEY and should not contain a passphase.

    Put your private key into secret, use the namespace the GitRepo is in:

    kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key  --type=kubernetes.io/ssh-auth
    caution

    Private key with passphrase is not supported.

    caution

    The key has to be in PEM format.

    Fleet supports putting known_hosts into ssh secret. Here is an example of how to add it:

    Fetch the public key hash(take github as an example)

    ssh-keyscan -H github.com

    And add it into secret:

    apiVersion: v1
    kind: Secret
    metadata:
    name: ssh-key
    type: kubernetes.io/ssh-auth
    stringData:
    ssh-privatekey: <private-key>
    known_hosts: |-
    |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
    danger

    If you don't add it any server's public key will be trusted and added. (ssh -o stricthostkeychecking=accept-new will be used)

    info

    If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.

    Using HTTP Auth

    Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see HTTP secrets in Github.

    kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat

    Just like with SSH, reference the secret in your GitRepo resource via clientSecretName.

    spec:
    repo: https://github.com/fleetrepoci/gitjob-private.git
    branch: main
    clientSecretName: basic-auth-secret

    Using Private Helm Repositories

    danger

    The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource. Make sure you don't leak credentials by mixing public and private repositories. Split them into different gitrepos, or use -helmRepoURLRegex to limit the scope of credentials to certain servers.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +helmRepoURLRegex to limit the scope of credentials to certain servers.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/0.6/gitrepo-content.html b/0.6/gitrepo-content.html index f831da556..68ad70b88 100644 --- a/0.6/gitrepo-content.html +++ b/0.6/gitrepo-content.html @@ -4,7 +4,7 @@ Git Repository Contents | Fleet - + @@ -43,8 +43,8 @@ the contents of a file the convention of adding _patch. (notice the will be replaced with . from the file name and that will be used as the target. For example deployment_patch.yaml will target deployment.yaml. The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch. Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written -using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    - +using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    + \ No newline at end of file diff --git a/0.6/gitrepo-targets.html b/0.6/gitrepo-targets.html index e320ac4d5..ccaf04f72 100644 --- a/0.6/gitrepo-targets.html +++ b/0.6/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -21,8 +21,8 @@ that the value {} for a selector means "match everything." and add clusters to it.

    Customization per Cluster

    To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use multi-cluster/helm/fleet.yaml.

    Situation: User has three clusters with three different labels: env=dev, env=test, and env=prod. User wants to deploy a frontend application with a backend database across these clusters.

    Expected behavior:

    • After deploying to the dev cluster, database replication is not enabled.
    • After deploying to the test cluster, database replication is enabled.
    • After deploying to the prod cluster, database replication is enabled and Load balancer services are exposed.

    Advantage of Fleet:

    Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:

    1. Deploy gitRepo https://github.com/rancher/fleet-examples.git and specify the path multi-cluster/helm.
    2. Under multi-cluster/helm, a Helm chart will deploy the frontend app service and backend database service.
    3. The following rule will be defined in fleet.yaml:
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    Result:

    Fleet will deploy the Helm chart with your customized values.yaml to the different clusters.

    Note: Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.

    important information

    Overriding the version of a Helm chart via target customizations will lead to bundles containing all versions, ie the default one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will deploy larger bundles.

    As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed etcd's configured maximum blob size. See this issue for more details.

    Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/0.6/imagescan.html b/0.6/imagescan.html index 5f296055a..a8bdbc87e 100644 --- a/0.6/imagescan.html +++ b/0.6/imagescan.html @@ -4,15 +4,15 @@ Using Image Scan to Update Container Image References | Fleet - +
    Skip to main content
    Version: 0.6

    Using Image Scan to Update Container Image References

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/0.6/installation.html b/0.6/installation.html index 84a438c11..0fc257efb 100644 --- a/0.6/installation.html +++ b/0.6/installation.html @@ -4,7 +4,7 @@ Installation Details | Fleet - + @@ -37,8 +37,8 @@ the ca.pem is not correct. The contents of the $API_SERVER_CA and the CA certificate is in the file ca.pem. If your API server URL is signed by a well-known CA you can omit the apiServerCA parameter below or just create an empty ca.pem file (ie touch ca.pem).

    Setup the environment with your specific values, e.g.:

    API_SERVER_URL="https://example.com:6443"
    API_SERVER_CA="ca.pem"

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First install the Fleet CustomResourcesDefintions.
    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz

    Second install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="$API_SERVER_URL" \
    --set-file apiServerCA="$API_SERVER_CA" \
    fleet https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/0.6/multi-user.html b/0.6/multi-user.html index 43c434017..5cd497114 100644 --- a/0.6/multi-user.html +++ b/0.6/multi-user.html @@ -4,7 +4,7 @@ Setup Multi User | Fleet - + @@ -17,8 +17,8 @@ deploy cluster wide resources. Even with the available Fleet restrictions, users are only restricted to namespaces, but namespaces don't provide much isolation on their own. E.g. they can still consume as many resources as they like.

    However, the existing Fleet restrictions allow users to share clusters, and -deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    - +deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    + \ No newline at end of file diff --git a/0.6/namespaces.html b/0.6/namespaces.html index 8699f6739..876372d89 100644 --- a/0.6/namespaces.html +++ b/0.6/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -39,8 +39,8 @@ in an error state and won't be deployed.

    This can also be used to set If an allowedTargetNamespaces restriction is present, all GitRepos must specify a targetNamespace and the specified namespace must be in the allow list. -This also prevents the creation of cluster wide resources.

    - +This also prevents the creation of cluster wide resources.

    + \ No newline at end of file diff --git a/0.6/quickstart.html b/0.6/quickstart.html index ba7ff7763..15a0005a7 100644 --- a/0.6/quickstart.html +++ b/0.6/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Version: 0.6

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure things to your cluster.

    brew install helm

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz
    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz

    Add a Git Repo to Watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/0.6/ref-bundle-stages.html b/0.6/ref-bundle-stages.html index 26a5ac208..f4fc87cf2 100644 --- a/0.6/ref-bundle-stages.html +++ b/0.6/ref-bundle-stages.html @@ -4,13 +4,13 @@ Bundle Lifecycle | Fleet - +
    -
    Version: 0.6

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    - +
    Skip to main content
    Version: 0.6

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    + \ No newline at end of file diff --git a/0.6/ref-configuration.html b/0.6/ref-configuration.html index 394c900f6..d9a4bd16e 100644 --- a/0.6/ref-configuration.html +++ b/0.6/ref-configuration.html @@ -4,13 +4,13 @@ Configuration | Fleet - +
    -
    Version: 0.6

    Configuration

    A reference list of, mostly internal, configuration options.

    Helm Charts

    The Helm charts accept, at least, the options as shown with their default in values.yaml:

    Environment Variables

    The controllers can be started with these environment variables:

    • CATTLE_DEV_MODE - used to debug wrangler, not usable
    • FLEET_CLUSTER_ENQUEUE_DELAY - tune how often non-ready clusters are checked
    • FLEET_CPU_PPROF_PERIOD - used to turn on performance profiling

    Configuration

    In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments.

    The config struct is used in both config maps:

    • cattle-fleet-system/fleet-agent
    • cattle-fleet-system/fleet-controller

    Labels

    Labels used by fleet:

    • fleet.cattle.io/agent=true - NodeSelector label for agent's deployment affinity setting
    • fleet.cattle.io/non-managed-agent - managed agent bundle won't target Clusters with this label
    • fleet.cattle.io/repo-name - used on Bundle to reference the git repo resource
    • fleet.cattle.io/bundle-namespace - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/bundle-name - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/managed=true - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces.
    • fleet.cattle.io/bootstrap-token - unused

    Annotations

    Annotations used by fleet:

    • fleet.cattle.io/agent-namespace
    • fleet.cattle.io/bundle-id
    • fleet.cattle.io/cluster, fleet.cattle.io/cluster-namespace - used on a cluster namespace to reference the cluster registration namespace and cluster name
    • fleet.cattle.io/cluster-group
    • fleet.cattle.io/cluster-registration-namespace
    • fleet.cattle.io/cluster-registration
    • fleet.cattle.io/commit
    • fleet.cattle.io/managed - appears unused
    • fleet.cattle.io/service-account
    - +
    Skip to main content
    Version: 0.6

    Configuration

    A reference list of, mostly internal, configuration options.

    Helm Charts

    The Helm charts accept, at least, the options as shown with their default in values.yaml:

    Environment Variables

    The controllers can be started with these environment variables:

    • CATTLE_DEV_MODE - used to debug wrangler, not usable
    • FLEET_CLUSTER_ENQUEUE_DELAY - tune how often non-ready clusters are checked
    • FLEET_CPU_PPROF_PERIOD - used to turn on performance profiling

    Configuration

    In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments.

    The config struct is used in both config maps:

    • cattle-fleet-system/fleet-agent
    • cattle-fleet-system/fleet-controller

    Labels

    Labels used by fleet:

    • fleet.cattle.io/agent=true - NodeSelector label for agent's deployment affinity setting
    • fleet.cattle.io/non-managed-agent - managed agent bundle won't target Clusters with this label
    • fleet.cattle.io/repo-name - used on Bundle to reference the git repo resource
    • fleet.cattle.io/bundle-namespace - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/bundle-name - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/managed=true - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces.
    • fleet.cattle.io/bootstrap-token - unused

    Annotations

    Annotations used by fleet:

    • fleet.cattle.io/agent-namespace
    • fleet.cattle.io/bundle-id
    • fleet.cattle.io/cluster, fleet.cattle.io/cluster-namespace - used on a cluster namespace to reference the cluster registration namespace and cluster name
    • fleet.cattle.io/cluster-group
    • fleet.cattle.io/cluster-registration-namespace
    • fleet.cattle.io/cluster-registration
    • fleet.cattle.io/commit
    • fleet.cattle.io/managed - appears unused
    • fleet.cattle.io/service-account
    + \ No newline at end of file diff --git a/0.6/ref-crds.html b/0.6/ref-crds.html index 2cbe64026..22191b3ef 100644 --- a/0.6/ref-crds.html +++ b/0.6/ref-crds.html @@ -4,13 +4,13 @@ Custom Resources Spec | Fleet - +
    -
    Version: 0.6

    Custom Resources Spec

    Sub Resources

    GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsstringfalse
    statestringfalse
    messagestringfalse
    errorboolfalse

    Back to Custom Resources

    GitRepoResource

    FieldDescriptionSchemeRequired
    apiVersionstringfalse
    kindstringfalse
    typestringfalse
    idstringfalse
    namespacestringfalse
    namestringfalse
    incompleteStateboolfalse
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    perClusterState[][ResourcePerClusterState](#resourceperclusterstate)false

    Back to Custom Resources

    GitRepoResourceCounts

    FieldDescriptionSchemeRequired
    readyinttrue
    desiredReadyinttrue
    waitAppliedinttrue
    modifiedinttrue
    orphanedinttrue
    missinginttrue
    unknowninttrue
    notReadyinttrue

    Back to Custom Resources

    GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountstringfalse
    allowedServiceAccounts[]stringfalse
    allowedRepoPatterns[]stringfalse
    defaultClientSecretNamestringfalse
    allowedClientSecretNames[]stringfalse
    allowedTargetNamespaces[]stringfalse

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and indexstringfalse
    branchBranch The git branch to followstringfalse
    revisionRevision A specific commit or tag to operate onstringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demandstringfalse
    clientSecretNameClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for private helm repositorystringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not providedstringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default[]stringfalse
    pausedPaused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSyncboolfalse
    serviceAccountServiceAccount used in the downstream cluster for deploymentstringfalse
    targetsTargets is a list of target this repo will deploy to[][GitTarget](#gittarget)false
    pollingIntervalPollingInterval is how often to check git for new updates*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Gitint64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when new image is scanned and write back to git repoCommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepoboolfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationint64true
    commitstringfalse
    readyClustersinttrue
    desiredReadyClustersinttrue
    gitJobStatusstringfalse
    summaryBundleSummaryfalse
    displayGitRepoDisplayfalse
    conditions[]genericcondition.GenericConditionfalse
    resources[][GitRepoResource](#gitreporesource)false
    resourceCountsGitRepoResourceCountsfalse
    resourceErrors[]stringfalse
    lastSyncedImageScanTimemetav1.Timefalse

    Back to Custom Resources

    GitTarget

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    FieldDescriptionSchemeRequired
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    patch*GenericMapfalse
    clusterIdstringfalse

    Back to Custom Resources

    Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    stagedOptionsBundleDeploymentOptionsfalse
    stagedDeploymentIDstringfalse
    optionsBundleDeploymentOptionsfalse
    deploymentIDstringfalse
    dependsOn[][BundleRef](#bundleref)false

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[][NonReadyStatus](#nonreadystatus)false
    modifiedStatus[][ModifiedStatus](#modifiedstatus)false
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false

    Back to Custom Resources

    BundleDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    statestringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    namestringfalse
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    FieldDescriptionSchemeRequired
    namestringfalse
    contentstringfalse
    encodingstringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contain the actual resources from the git repo which will be deployed.[][BundleResource](#bundleresource)false
    targetsTargets refer to the clusters which will be deployed to.[][BundleTarget](#bundletarget)false
    targetRestrictionsTargetRestrictions restrict which clusters the bundle will be deployed to.[][BundleTargetRestriction](#bundletargetrestriction)false
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[][BundleRef](#bundleref)false

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    newlyCreatedintfalse
    unavailableinttrue
    unavailablePartitionsinttrue
    maxUnavailableinttrue
    maxUnavailablePartitionsinttrue
    maxNewintfalse
    partitions[][PartitionStatus](#partitionstatus)false
    displayBundleDisplayfalse
    resourceKey[][ResourceKey](#resourcekey)false
    observedGenerationint64true

    Back to Custom Resources

    BundleSummary

    FieldDescriptionSchemeRequired
    notReadyintfalse
    waitAppliedintfalse
    errAppliedintfalse
    outOfSyncintfalse
    modifiedintfalse
    readyinttrue
    pendingintfalse
    desiredReadyinttrue
    nonReadyResources[][NonReadyResource](#nonreadyresource)false

    Back to Custom Resources

    BundleTarget

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleTargetRestriction

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ComparePatch

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    operations[][Operation](#operation)false
    jsonPointers[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    Content

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    content[]bytefalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatches[][ComparePatch](#comparepatch)false

    Back to Custom Resources

    HelmOptions

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[][ValuesFrom](#valuesfrom)false
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse

    Back to Custom Resources

    KustomizeOptions

    FieldDescriptionSchemeRequired
    dirstringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    namestringtrue

    Back to Custom Resources

    ModifiedStatus

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyResource

    FieldDescriptionSchemeRequired
    namestringfalse
    bundleStateBundleStatefalse
    messagestringfalse
    modifiedStatus[][ModifiedStatus](#modifiedstatus)false
    nonReadyStatus[][NonReadyStatus](#nonreadystatus)false

    Back to Custom Resources

    NonReadyStatus

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    FieldDescriptionSchemeRequired
    opstringfalse
    pathstringfalse
    valuestringfalse

    Back to Custom Resources

    Partition

    FieldDescriptionSchemeRequired
    namestringfalse
    maxUnavailable*intstr.IntOrStringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    FieldDescriptionSchemeRequired
    namestringfalse
    countintfalse
    maxUnavailableintfalse
    unavailableintfalse
    summaryBundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse

    Back to Custom Resources

    RolloutStrategy

    FieldDescriptionSchemeRequired
    maxUnavailable*intstr.IntOrStringfalse
    maxUnavailablePartitions*intstr.IntOrStringfalse
    autoPartitionSize*intstr.IntOrStringfalse
    partitions[][Partition](#partition)false

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    FieldDescriptionSchemeRequired
    overlays[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenmetav1.Timetrue
    namespacestringtrue
    nonReadyNodesinttrue
    readyNodesinttrue
    nonReadyNodeNamesAt most 3 nodes[]stringtrue
    readyNodeNamesAt most 3 nodes[]stringtrue

    Back to Custom Resources

    Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesstringfalse
    readyNodesstringfalse
    sampleNodestringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    readyBundlesstringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountinttrue
    nonReadyClusterCountinttrue
    nonReadyClusters[]stringfalse
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    displayClusterGroupDisplayfalse
    resourceCountsGitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDstringfalse
    clientRandomstringfalse
    clusterLabelsmap[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNamestringfalse
    grantedboolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttl*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expires*metav1.Timefalse
    secretNamestringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]v1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]v1.Tolerationfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summaryBundleSummaryfalse
    resourceCountsGitRepoResourceCountsfalse
    readyGitReposinttrue
    desiredReadyGitReposinttrue
    agentEnvVarsHashstringfalse
    agentPrivateRepoURLstringfalse
    agentDeployedGeneration*int64false
    agentMigratedboolfalse
    agentNamespaceMigratedboolfalse
    cattleNamespaceMigratedboolfalse
    displayClusterDisplayfalse
    agentAgentStatusfalse

    Back to Custom Resources

    - +
    Skip to main content
    Version: 0.6

    Custom Resources Spec

    Sub Resources

    GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsstringfalse
    statestringfalse
    messagestringfalse
    errorboolfalse

    Back to Custom Resources

    GitRepoResource

    FieldDescriptionSchemeRequired
    apiVersionstringfalse
    kindstringfalse
    typestringfalse
    idstringfalse
    namespacestringfalse
    namestringfalse
    incompleteStateboolfalse
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    perClusterState[][ResourcePerClusterState](#resourceperclusterstate)false

    Back to Custom Resources

    GitRepoResourceCounts

    FieldDescriptionSchemeRequired
    readyinttrue
    desiredReadyinttrue
    waitAppliedinttrue
    modifiedinttrue
    orphanedinttrue
    missinginttrue
    unknowninttrue
    notReadyinttrue

    Back to Custom Resources

    GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountstringfalse
    allowedServiceAccounts[]stringfalse
    allowedRepoPatterns[]stringfalse
    defaultClientSecretNamestringfalse
    allowedClientSecretNames[]stringfalse
    allowedTargetNamespaces[]stringfalse

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and indexstringfalse
    branchBranch The git branch to followstringfalse
    revisionRevision A specific commit or tag to operate onstringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demandstringfalse
    clientSecretNameClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for private helm repositorystringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not providedstringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default[]stringfalse
    pausedPaused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSyncboolfalse
    serviceAccountServiceAccount used in the downstream cluster for deploymentstringfalse
    targetsTargets is a list of target this repo will deploy to[][GitTarget](#gittarget)false
    pollingIntervalPollingInterval is how often to check git for new updates*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Gitint64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when new image is scanned and write back to git repoCommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepoboolfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationint64true
    commitstringfalse
    readyClustersinttrue
    desiredReadyClustersinttrue
    gitJobStatusstringfalse
    summaryBundleSummaryfalse
    displayGitRepoDisplayfalse
    conditions[]genericcondition.GenericConditionfalse
    resources[][GitRepoResource](#gitreporesource)false
    resourceCountsGitRepoResourceCountsfalse
    resourceErrors[]stringfalse
    lastSyncedImageScanTimemetav1.Timefalse

    Back to Custom Resources

    GitTarget

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    FieldDescriptionSchemeRequired
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    patch*GenericMapfalse
    clusterIdstringfalse

    Back to Custom Resources

    Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    stagedOptionsBundleDeploymentOptionsfalse
    stagedDeploymentIDstringfalse
    optionsBundleDeploymentOptionsfalse
    deploymentIDstringfalse
    dependsOn[][BundleRef](#bundleref)false

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[][NonReadyStatus](#nonreadystatus)false
    modifiedStatus[][ModifiedStatus](#modifiedstatus)false
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false

    Back to Custom Resources

    BundleDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    statestringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    namestringfalse
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    FieldDescriptionSchemeRequired
    namestringfalse
    contentstringfalse
    encodingstringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contain the actual resources from the git repo which will be deployed.[][BundleResource](#bundleresource)false
    targetsTargets refer to the clusters which will be deployed to.[][BundleTarget](#bundletarget)false
    targetRestrictionsTargetRestrictions restrict which clusters the bundle will be deployed to.[][BundleTargetRestriction](#bundletargetrestriction)false
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[][BundleRef](#bundleref)false

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    newlyCreatedintfalse
    unavailableinttrue
    unavailablePartitionsinttrue
    maxUnavailableinttrue
    maxUnavailablePartitionsinttrue
    maxNewintfalse
    partitions[][PartitionStatus](#partitionstatus)false
    displayBundleDisplayfalse
    resourceKey[][ResourceKey](#resourcekey)false
    observedGenerationint64true

    Back to Custom Resources

    BundleSummary

    FieldDescriptionSchemeRequired
    notReadyintfalse
    waitAppliedintfalse
    errAppliedintfalse
    outOfSyncintfalse
    modifiedintfalse
    readyinttrue
    pendingintfalse
    desiredReadyinttrue
    nonReadyResources[][NonReadyResource](#nonreadyresource)false

    Back to Custom Resources

    BundleTarget

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleTargetRestriction

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ComparePatch

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    operations[][Operation](#operation)false
    jsonPointers[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    Content

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    content[]bytefalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatches[][ComparePatch](#comparepatch)false

    Back to Custom Resources

    HelmOptions

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[][ValuesFrom](#valuesfrom)false
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse

    Back to Custom Resources

    KustomizeOptions

    FieldDescriptionSchemeRequired
    dirstringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    namestringtrue

    Back to Custom Resources

    ModifiedStatus

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyResource

    FieldDescriptionSchemeRequired
    namestringfalse
    bundleStateBundleStatefalse
    messagestringfalse
    modifiedStatus[][ModifiedStatus](#modifiedstatus)false
    nonReadyStatus[][NonReadyStatus](#nonreadystatus)false

    Back to Custom Resources

    NonReadyStatus

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    FieldDescriptionSchemeRequired
    opstringfalse
    pathstringfalse
    valuestringfalse

    Back to Custom Resources

    Partition

    FieldDescriptionSchemeRequired
    namestringfalse
    maxUnavailable*intstr.IntOrStringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    FieldDescriptionSchemeRequired
    namestringfalse
    countintfalse
    maxUnavailableintfalse
    unavailableintfalse
    summaryBundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse

    Back to Custom Resources

    RolloutStrategy

    FieldDescriptionSchemeRequired
    maxUnavailable*intstr.IntOrStringfalse
    maxUnavailablePartitions*intstr.IntOrStringfalse
    autoPartitionSize*intstr.IntOrStringfalse
    partitions[][Partition](#partition)false

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    FieldDescriptionSchemeRequired
    overlays[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenmetav1.Timetrue
    namespacestringtrue
    nonReadyNodesinttrue
    readyNodesinttrue
    nonReadyNodeNamesAt most 3 nodes[]stringtrue
    readyNodeNamesAt most 3 nodes[]stringtrue

    Back to Custom Resources

    Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesstringfalse
    readyNodesstringfalse
    sampleNodestringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    readyBundlesstringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountinttrue
    nonReadyClusterCountinttrue
    nonReadyClusters[]stringfalse
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    displayClusterGroupDisplayfalse
    resourceCountsGitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDstringfalse
    clientRandomstringfalse
    clusterLabelsmap[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNamestringfalse
    grantedboolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttl*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expires*metav1.Timefalse
    secretNamestringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]v1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]v1.Tolerationfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summaryBundleSummaryfalse
    resourceCountsGitRepoResourceCountsfalse
    readyGitReposinttrue
    desiredReadyGitReposinttrue
    agentEnvVarsHashstringfalse
    agentPrivateRepoURLstringfalse
    agentDeployedGeneration*int64false
    agentMigratedboolfalse
    agentNamespaceMigratedboolfalse
    cattleNamespaceMigratedboolfalse
    displayClusterDisplayfalse
    agentAgentStatusfalse

    Back to Custom Resources

    + \ No newline at end of file diff --git a/0.6/ref-fleet-yaml.html b/0.6/ref-fleet-yaml.html index d6f7f2954..01ff2a288 100644 --- a/0.6/ref-fleet-yaml.html +++ b/0.6/ref-fleet-yaml.html @@ -4,13 +4,13 @@ fleet.yaml | Fleet - +
    -
    Version: 0.6

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to https://github.com/rancher/fleet/blob/main/pkg/bundlereader/read.go#L129-L135, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. However, the `uuidv4` function is not supported.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey
    - +
    Skip to main content
    Version: 0.6

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to https://github.com/rancher/fleet/blob/main/pkg/bundlereader/read.go#L129-L135, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. However, the `uuidv4` function is not supported.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey
    + \ No newline at end of file diff --git a/0.6/ref-gitrepo.html b/0.6/ref-gitrepo.html index 649939de9..aac7fdf14 100644 --- a/0.6/ref-gitrepo.html +++ b/0.6/ref-gitrepo.html @@ -4,14 +4,14 @@ GitRepo Resource | Fleet - +
    Version: 0.6

    GitRepo Resource

    The GitRepo resource describes git repositories, how to access them and where the bundles are located.

    The content of the resource corresponds to the GitRepoSpec. -For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...
    - +For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...
    + \ No newline at end of file diff --git a/0.6/ref-registration.html b/0.6/ref-registration.html index a9987109e..2be79f2ec 100644 --- a/0.6/ref-registration.html +++ b/0.6/ref-registration.html @@ -4,14 +4,14 @@ Cluster Registration Internals | Fleet - +
    Version: 0.6

    Cluster Registration Internals

    Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster. -It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    - +It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    + \ No newline at end of file diff --git a/0.6/ref-resources.html b/0.6/ref-resources.html index 273220d80..2f19eb85e 100644 --- a/0.6/ref-resources.html +++ b/0.6/ref-resources.html @@ -4,13 +4,13 @@ Custom Resources | Fleet - + - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.6/troubleshooting.html b/0.6/troubleshooting.html index ec3f42f79..12c2ba489 100644 --- a/0.6/troubleshooting.html +++ b/0.6/troubleshooting.html @@ -4,15 +4,15 @@ Troubleshooting | Fleet - +
    Version: 0.6

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority" 

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name> 
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Agent is no longer registered

    You can force a redeployment of an agent for a given cluster by setting redeployAgentGeneration.

    kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p '[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]'

    Nested GitRepo CRs

    Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available.

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    + \ No newline at end of file diff --git a/0.6/tut-deployment.html b/0.6/tut-deployment.html index a6d26c711..44910406a 100644 --- a/0.6/tut-deployment.html +++ b/0.6/tut-deployment.html @@ -4,7 +4,7 @@ Creating a Deployment | Fleet - + @@ -13,8 +13,8 @@ For more details on the options that are available per Git repository see Adding a GitRepo.

    Single-Cluster Examples

    All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet.

    An example using Helm. We are deploying the helm example to the local cluster.

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment:

    fleet.yaml
    namespace: fleet-helm-example

    # Custom helm options
    helm:
    # The release name to use. If empty a generated release name will be used
    releaseName: guestbook

    # The directory of the chart in the repo. Also any valid go-getter supported
    # URL can be used there is specify where to download the chart from.
    # If repo below is set this value if the chart name in the repo
    chart: ""

    # An https to a valid Helm repository to download the chart from
    repo: ""

    # Used if repo is set to look up the version of the chart
    version: ""

    # Force recreate resource that can not be updated
    force: false

    # How long for helm to wait for the release to be active. If the value
    # is less that or equal to zero, we will not wait in Helm
    timeoutSeconds: 0

    # Custom values that will be passed as values.yaml to the installation
    values:
    replicas: 2

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-local namespace contains the local cluster resource. The local fleet-agent will create the deployment in the fleet-helm-example namespace.

    kubectl apply -n fleet-local -f - <<EOF
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - single-cluster/helm
    EOF

    Multi-Cluster Examples

    The examples below will deploy a multi git repo to multiple clusters at once and configure the app differently for each target.

    An example using Helm. We are deploying the helm example and customizing it per target cluster

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment. The fleet.yaml is used to configure different deployment options, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-helm-example
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/helm
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod

    By applying the gitrepo resource to the upstream cluster, fleet will start to monitor the repository and create deployments:

    kubectl apply -n fleet-default -f gitrepo.yaml
    - +The application will be customized as follows per environment:

    • Dev clusters: Only the redis leader is deployed and not the followers.
    • Test clusters: Scale the front deployment to 3
    • Prod clusters: Scale the front deployment to 3 and set the service type to LoadBalancer

    The fleet.yaml is used to control which 'yaml' overlays are used, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-manifest-example
    targetCustomizations:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev
    yaml:
    overlays:
    # Refers to overlays/noreplication folder
    - noreplication

    - name: test
    clusterSelector:
    matchLabels:
    env: test
    yaml:
    overlays:
    # Refers to overlays/scale3 folder
    - scale3

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    yaml:
    # Refers to overlays/servicelb, scale3 folders
    overlays:
    - servicelb
    - scale3

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: manifests
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/manifests
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    kubectl apply -n fleet-default -f gitrepo.yaml
    + \ No newline at end of file diff --git a/0.6/uninstall.html b/0.6/uninstall.html index 9c4d79e7f..260a00605 100644 --- a/0.6/uninstall.html +++ b/0.6/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - +
    Version: 0.6

    Uninstall

    Fleet is packaged as two Helm charts so uninstall is accomplished by uninstalling the appropriate Helm charts. To uninstall Fleet run the following -two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    caution

    Uninstalling the CRDs will remove all deployed workloads.

    - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    caution

    Uninstalling the CRDs will remove all deployed workloads.

    + \ No newline at end of file diff --git a/0.6/webhook.html b/0.6/webhook.html index c87165467..e8796b8fb 100644 --- a/0.6/webhook.html +++ b/0.6/webhook.html @@ -4,7 +4,7 @@ Using Webhooks Instead of Polling | Fleet - + @@ -12,8 +12,8 @@
    Skip to main content
    Version: 0.6

    Using Webhooks Instead of Polling

    By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file diff --git a/0.7.html b/0.7.html index 9243dc580..0917d44f0 100644 --- a/0.7.html +++ b/0.7.html @@ -4,13 +4,13 @@ Overview | Fleet - +
    -
    Version: 0.7

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    - +
    Skip to main content
    Version: 0.7

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    + \ No newline at end of file diff --git a/0.7/architecture.html b/0.7/architecture.html index 3f683231a..270993801 100644 --- a/0.7/architecture.html +++ b/0.7/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

    The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    - +subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    + \ No newline at end of file diff --git a/0.7/bundle-add.html b/0.7/bundle-add.html index 0b358b69e..a4a3f27b7 100644 --- a/0.7/bundle-add.html +++ b/0.7/bundle-add.html @@ -4,7 +4,7 @@ Create a Bundle Resource | Fleet - + @@ -15,8 +15,8 @@ manually by the user. If you want to deploy resources from a git repository use When creating a Bundle resources need to be explicitly specified in the Bundle Spec. Resources can be compressed with gz. See here an example of how Rancher uses compression in go code.

    If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in GitRepo. -See Mapping to Downstream Clusters.

    The following example creates a nginx Deployment in the local cluster:

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    resources:
    # List of all resources that will be deployed
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml
    targets:
    - clusterName: local

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    - +See Mapping to Downstream Clusters.

    The following example creates a nginx Deployment in the local cluster:

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    resources:
    # List of all resources that will be deployed
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml
    targets:
    - clusterName: local

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    + \ No newline at end of file diff --git a/0.7/bundle-diffs.html b/0.7/bundle-diffs.html index 86c313e5d..1d4b4522b 100644 --- a/0.7/bundle-diffs.html +++ b/0.7/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs to Ignore Modified GitRepos | Fleet - +
    Version: 0.7

    Generating Diffs to Ignore Modified GitRepos

    Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

    You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

    The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

    This leads the status of the bundle and associated GitRepo to be reported as "Modified"

    Associated Bundle -

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    https://github.com/rancher/fleet-examples/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    - +

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    https://github.com/rancher/fleet-examples/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    + \ No newline at end of file diff --git a/0.7/changelogs.html b/0.7/changelogs.html index 2bc068281..604305bcc 100644 --- a/0.7/changelogs.html +++ b/0.7/changelogs.html @@ -4,13 +4,13 @@ 0.7 Changelogs | Fleet - +
    -
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.7/changelogs/changelogs/v0.7.0.html b/0.7/changelogs/changelogs/v0.7.0.html index 4ca887d78..10fff14e5 100644 --- a/0.7/changelogs/changelogs/v0.7.0.html +++ b/0.7/changelogs/changelogs/v0.7.0.html @@ -4,13 +4,13 @@ v0.7.0 | Fleet - +
    -
    Version: 0.7

    v0.7.0

    • (rancherio-gh-m) released this 2023-06-12 13:24:29 +0000 UTC*

    Description

    Notes

    The packaged helm chart fleet-0.7.0.tgz was reuploaded to fix the Gitjob version constraint following #1593

    Additions

    • Add agent config for tolerations, affinity, resources on cluster by @manno in #1433
    • Add JSON schema validation for agent customization in cluster CRD by @raulcabello in #1490
    • Configure tolerations for fleet-agent from cluster CR by @rajiteh in #1154
    • Agent registration recovery by @rancherbot in #1579
    • Clean up orphaned request service accounts, remove unused managed annotations by @thardeck in #1310
    • Add flag to disable local cluster bootstrap by @manno in #1207
    • Fix agent not starting in old fleet-system namespace by @raulcabello in #1316
    • Configure FLEET_CLUSTER_ENQUEUE_DELAY in helm chart by @johnjcool in #1404
    • Do not always create a Bundle for the root path by @raulcabello in #1309
    • Always get labels from Bundle when creating a BundleDeployment by @raulcabello in #1428
    • Add helm capabilities to agent's deployer by @manno in #1287
    • Add waitForJobs as a helm option by @raulcabello in #1330
    • Allow resources to be kept when deleting a GitRepo or a Bundle by @raulcabello in #1382
    • Improve behavior on failed deployments by @moio in #1485
    • Add ignore conditions for the status of deployed custom resources by @raulcabello in #1482

    Bugfixes

    • Ensure fleet-agent's helm release name has valid length by @manno in #1353
    • Ensure ClusterRegistrationToken name is below 63 characters by @manno in #1360
    • AllowedRepoPatterns in GitRepoRestriction is matched against Repo by @johnjcool in #1379
    • Properly set keepResources if releaseName is empty by @raulcabello in #1394
    • Retry helm upgrade if it was interrupted by @raulcabello in #1424
    • Fix BundleNamespaceMapping ignoring bundle selector by @manno in #1425
    • Don't ignore config map reference in valuesFrom list element by @manno in #1431
    • Agent should only select Linux nodes by @manno in #1505
    • Also check chart with the helmRepoURLRegex by @raulcabello in #1341
    • Fix cluster targeting and missing customizations by @raulcabello in #1473

    What's Changed

    • Add container security context to fleet-agent helm chart by @puffitos in #1293
    • Managed fleet-agent uses same securityContext as helm chart by @thardeck in #1314
    • Remove fleet-agent simulators by @manno in #1206
    • Remove flag to disable leaderElection for simulators by @raulcabello in #1426
    • Add Github action to release Fleet against Rancher by @thardeck in #1346
    • Change version number for nightly releases by @manno in #1367
    • Log regex compilation error in git repo restriction with patterns by @manno in #1383
    • Split Examples Tests from E2E Tests by @manno in #1397
    • Add nightly e2e workflow to test more k8s versions by @manno in #1518
    • Replace deprecated command in Github action with environment file by @jongwooo in #1500

    New Contributors

    Full Changelog: v0.6.0...v0.7.0

    Download

    Information retrieved from here

    - +
    Skip to main content
    Version: 0.7

    v0.7.0

    • (rancherio-gh-m) released this 2023-06-12 13:24:29 +0000 UTC*

    Description

    Notes

    The packaged helm chart fleet-0.7.0.tgz was reuploaded to fix the Gitjob version constraint following #1593

    Additions

    • Add agent config for tolerations, affinity, resources on cluster by @manno in #1433
    • Add JSON schema validation for agent customization in cluster CRD by @raulcabello in #1490
    • Configure tolerations for fleet-agent from cluster CR by @rajiteh in #1154
    • Agent registration recovery by @rancherbot in #1579
    • Clean up orphaned request service accounts, remove unused managed annotations by @thardeck in #1310
    • Add flag to disable local cluster bootstrap by @manno in #1207
    • Fix agent not starting in old fleet-system namespace by @raulcabello in #1316
    • Configure FLEET_CLUSTER_ENQUEUE_DELAY in helm chart by @johnjcool in #1404
    • Do not always create a Bundle for the root path by @raulcabello in #1309
    • Always get labels from Bundle when creating a BundleDeployment by @raulcabello in #1428
    • Add helm capabilities to agent's deployer by @manno in #1287
    • Add waitForJobs as a helm option by @raulcabello in #1330
    • Allow resources to be kept when deleting a GitRepo or a Bundle by @raulcabello in #1382
    • Improve behavior on failed deployments by @moio in #1485
    • Add ignore conditions for the status of deployed custom resources by @raulcabello in #1482

    Bugfixes

    • Ensure fleet-agent's helm release name has valid length by @manno in #1353
    • Ensure ClusterRegistrationToken name is below 63 characters by @manno in #1360
    • AllowedRepoPatterns in GitRepoRestriction is matched against Repo by @johnjcool in #1379
    • Properly set keepResources if releaseName is empty by @raulcabello in #1394
    • Retry helm upgrade if it was interrupted by @raulcabello in #1424
    • Fix BundleNamespaceMapping ignoring bundle selector by @manno in #1425
    • Don't ignore config map reference in valuesFrom list element by @manno in #1431
    • Agent should only select Linux nodes by @manno in #1505
    • Also check chart with the helmRepoURLRegex by @raulcabello in #1341
    • Fix cluster targeting and missing customizations by @raulcabello in #1473

    What's Changed

    • Add container security context to fleet-agent helm chart by @puffitos in #1293
    • Managed fleet-agent uses same securityContext as helm chart by @thardeck in #1314
    • Remove fleet-agent simulators by @manno in #1206
    • Remove flag to disable leaderElection for simulators by @raulcabello in #1426
    • Add Github action to release Fleet against Rancher by @thardeck in #1346
    • Change version number for nightly releases by @manno in #1367
    • Log regex compilation error in git repo restriction with patterns by @manno in #1383
    • Split Examples Tests from E2E Tests by @manno in #1397
    • Add nightly e2e workflow to test more k8s versions by @manno in #1518
    • Replace deprecated command in Github action with environment file by @jongwooo in #1500

    New Contributors

    Full Changelog: v0.6.0...v0.7.0

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.7/changelogs/changelogs/v0.7.1.html b/0.7/changelogs/changelogs/v0.7.1.html index e51d437dd..033c6b9e6 100644 --- a/0.7/changelogs/changelogs/v0.7.1.html +++ b/0.7/changelogs/changelogs/v0.7.1.html @@ -4,13 +4,13 @@ v0.7.1 | Fleet - +
    -
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.7/cli/fleet-agent.html b/0.7/cli/fleet-agent.html index d6fb8dc15..03b26d5c7 100644 --- a/0.7/cli/fleet-agent.html +++ b/0.7/cli/fleet-agent.html @@ -4,13 +4,13 @@ Fleet - + - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.7/cli/fleet-cli/fleet.html b/0.7/cli/fleet-cli/fleet.html index 309da34ae..9bb66859c 100644 --- a/0.7/cli/fleet-cli/fleet.html +++ b/0.7/cli/fleet-cli/fleet.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.7

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet test - Match a bundle to a target and render the output
    - +
    Skip to main content
    Version: 0.7

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet test - Match a bundle to a target and render the output
    + \ No newline at end of file diff --git a/0.7/cli/fleet-cli/fleet_apply.html b/0.7/cli/fleet-cli/fleet_apply.html index 12497e294..75a0ca9dc 100644 --- a/0.7/cli/fleet-cli/fleet_apply.html +++ b/0.7/cli/fleet-cli/fleet_apply.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.7

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string           Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -h, --help help for apply
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Skip to main content
    Version: 0.7

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string           Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -h, --help help for apply
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.7/cli/fleet-cli/fleet_test.html b/0.7/cli/fleet-cli/fleet_test.html index b8d689f5a..f12c8643f 100644 --- a/0.7/cli/fleet-cli/fleet_test.html +++ b/0.7/cli/fleet-cli/fleet_test.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.7

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Skip to main content
    Version: 0.7

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.7/cli/fleet-controller/fleet-manager.html b/0.7/cli/fleet-controller/fleet-manager.html index d3b4c516d..c12a04a05 100644 --- a/0.7/cli/fleet-controller/fleet-manager.html +++ b/0.7/cli/fleet-controller/fleet-manager.html @@ -4,13 +4,13 @@ Fleet - + - +
    Skip to main content
    + \ No newline at end of file diff --git a/0.7/cluster-bundles-state.html b/0.7/cluster-bundles-state.html index 8049e1e7b..4f3361f99 100644 --- a/0.7/cluster-bundles-state.html +++ b/0.7/cluster-bundles-state.html @@ -4,13 +4,13 @@ Cluster and Bundle State | Fleet - +
    -
    Version: 0.7

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    - +
    Skip to main content
    Version: 0.7

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    + \ No newline at end of file diff --git a/0.7/cluster-group.html b/0.7/cluster-group.html index 2f8060220..3d665d786 100644 --- a/0.7/cluster-group.html +++ b/0.7/cluster-group.html @@ -4,7 +4,7 @@ Create Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    - +status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    + \ No newline at end of file diff --git a/0.7/cluster-registration.html b/0.7/cluster-registration.html index e7e515bac..fc9f3b986 100644 --- a/0.7/cluster-registration.html +++ b/0.7/cluster-registration.html @@ -4,7 +4,7 @@ Register Downstream Clusters | Fleet - + @@ -75,8 +75,8 @@ above example one can run the following one-liner:

    info

    If you are using Fleet standalone without Rancher, it must be installed as described in installation details.

    The manager-initiated registration is used when you add a cluster from the Rancher dashboard.

    Create Kubeconfig Secret

    The format of this secret is intended to match the format of the kubeconfig secret used in cluster-api. -This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    - +This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    + \ No newline at end of file diff --git a/0.7/concepts.html b/0.7/concepts.html index 09f88ff35..a61016066 100644 --- a/0.7/concepts.html +++ b/0.7/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

    • To see the life cycle of a bundle, click here.
  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/0.7/gitrepo-add.html b/0.7/gitrepo-add.html index 319b54e60..8a38dc63c 100644 --- a/0.7/gitrepo-add.html +++ b/0.7/gitrepo-add.html @@ -4,7 +4,7 @@ Create a GitRepo Resource | Fleet - + @@ -15,8 +15,8 @@ Make sure you don't leak credentials by mixing public and private repositor or split them into different gitrepos, or use helmRepoURLRegex to limit the scope of credentials to certain servers.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Use different helm credentials for each path

    info

    gitRepo.spec.helmSecretName will be ignored if gitRepo.spec.helmSecretNameForPaths is provided

    Create a file secrets-path.yaml that contains credentials for each path defined in a GitRepo. Credentials will not be used for paths that are not present in this file. The path is the actual path to the bundle (ie to a folder containing a fleet.yaml file) within the git repository, which might have more segments than the entry under paths:.

    Example:

    path-one: # path path-one must exist in the repository
    username: user
    password: pass
    path-two: # path path-one must exist in the repository
    username: user2
    password: pass2
    caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
    sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K

    Create the secret

    kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml

    In the previous example credentials for username user will be used for the path path-one and credentials for username -user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/0.7/gitrepo-content.html b/0.7/gitrepo-content.html index 6b16b4569..c6ef18e23 100644 --- a/0.7/gitrepo-content.html +++ b/0.7/gitrepo-content.html @@ -4,7 +4,7 @@ Git Repository Contents | Fleet - + @@ -43,8 +43,8 @@ the contents of a file the convention of adding _patch. (notice the will be replaced with . from the file name and that will be used as the target. For example deployment_patch.yaml will target deployment.yaml. The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch. Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written -using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    - +using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    + \ No newline at end of file diff --git a/0.7/gitrepo-targets.html b/0.7/gitrepo-targets.html index 3796486e6..da944f998 100644 --- a/0.7/gitrepo-targets.html +++ b/0.7/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -23,8 +23,8 @@ and add clusters to it.

    this issue for more details.

  • Helm.WaitForJobs

  • Kustomize.Dir

  • YAML.Overlays

  • Diff.ComparePatches

  • Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/0.7/imagescan.html b/0.7/imagescan.html index baa764f6e..8376b871f 100644 --- a/0.7/imagescan.html +++ b/0.7/imagescan.html @@ -4,15 +4,15 @@ Using Image Scan to Update Container Image References | Fleet - +
    Version: 0.7

    Using Image Scan to Update Container Image References

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/0.7/installation.html b/0.7/installation.html index 501bec92c..9a31fe2cd 100644 --- a/0.7/installation.html +++ b/0.7/installation.html @@ -4,7 +4,7 @@ Installation Details | Fleet - + @@ -37,8 +37,8 @@ the ca.pem is not correct. The contents of the $API_SERVER_CA and the CA certificate is in the file ca.pem. If your API server URL is signed by a well-known CA you can omit the apiServerCA parameter below or just create an empty ca.pem file (ie touch ca.pem).

    Setup the environment with your specific values, e.g.:

    API_SERVER_URL="https://example.com:6443"
    API_SERVER_CA="ca.pem"

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First add Fleet's Helm repository.
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Second install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd

    Third install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="$API_SERVER_URL" \
    --set-file apiServerCA="$API_SERVER_CA" \
    fleet

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/0.7/multi-user.html b/0.7/multi-user.html index 9e1b40549..c099265f9 100644 --- a/0.7/multi-user.html +++ b/0.7/multi-user.html @@ -4,7 +4,7 @@ Setup Multi User | Fleet - + @@ -17,8 +17,8 @@ deploy cluster wide resources. Even with the available Fleet restrictions, users are only restricted to namespaces, but namespaces don't provide much isolation on their own. E.g. they can still consume as many resources as they like.

    However, the existing Fleet restrictions allow users to share clusters, and -deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    - +deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    + \ No newline at end of file diff --git a/0.7/namespaces.html b/0.7/namespaces.html index 0439dc3ff..90faebc39 100644 --- a/0.7/namespaces.html +++ b/0.7/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -39,8 +39,8 @@ in an error state and won't be deployed.

    This can also be used to set If an allowedTargetNamespaces restriction is present, all GitRepos must specify a targetNamespace and the specified namespace must be in the allow list. -This also prevents the creation of cluster wide resources.

    - +This also prevents the creation of cluster wide resources.

    + \ No newline at end of file diff --git a/0.7/quickstart.html b/0.7/quickstart.html index b47cac45b..7419bb26f 100644 --- a/0.7/quickstart.html +++ b/0.7/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Version: 0.7

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is fairly straightforward. To install the Helm 3 CLI follow the official install instructions.

    Fleet in Rancher

    Rancher has separate helm charts for Fleet and uses a different repository.

    brew install helm
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
    helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet

    Add a Git Repo to Watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/0.7/ref-bundle-stages.html b/0.7/ref-bundle-stages.html index a19ddcafc..77bdf7e9c 100644 --- a/0.7/ref-bundle-stages.html +++ b/0.7/ref-bundle-stages.html @@ -4,13 +4,13 @@ Bundle Lifecycle | Fleet - +
    -
    Version: 0.7

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    - +
    Version: 0.7

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    + \ No newline at end of file diff --git a/0.7/ref-bundle.html b/0.7/ref-bundle.html index aecb67869..ca058e562 100644 --- a/0.7/ref-bundle.html +++ b/0.7/ref-bundle.html @@ -4,14 +4,14 @@ Bundle Resource | Fleet - +
    Version: 0.7

    Bundle Resource

    Bundles are automatically created by Fleet when a GitRepo is created.

    The content of the resource corresponds to the BundleSpec. -For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    - +For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    + \ No newline at end of file diff --git a/0.7/ref-configuration.html b/0.7/ref-configuration.html index b6b3d474b..300cbc322 100644 --- a/0.7/ref-configuration.html +++ b/0.7/ref-configuration.html @@ -4,7 +4,7 @@ Configuration | Fleet - + @@ -12,8 +12,8 @@
    Version: 0.7

    Configuration

    A reference list of, mostly internal, configuration options.

    Helm Charts

    The Helm charts accept, at least, the options as shown with their default in values.yaml:

    Environment Variables

    The controllers can be started with these environment variables:

    • CATTLE_DEV_MODE - used to debug wrangler, not usable
    • FLEET_CLUSTER_ENQUEUE_DELAY - tune how often non-ready clusters are checked
    • FLEET_CPU_PPROF_PERIOD - used to turn on performance profiling

    Configuration

    In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments.

    The config struct is used in both config maps:

    • cattle-fleet-system/fleet-agent
    • cattle-fleet-system/fleet-controller

    Labels

    Labels used by fleet:

    • fleet.cattle.io/agent=true - NodeSelector label for agent's deployment affinity setting
    • fleet.cattle.io/non-managed-agent - managed agent bundle won't target Clusters with this label
    • fleet.cattle.io/repo-name - used on Bundle to reference the git repo resource
    • fleet.cattle.io/bundle-namespace - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/bundle-name - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/managed=true - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces.
    • fleet.cattle.io/bootstrap-token - unused

    Annotations

    Annotations used by fleet:

    • fleet.cattle.io/agent-namespace
    • fleet.cattle.io/bundle-id
    • fleet.cattle.io/cluster, fleet.cattle.io/cluster-namespace - used on a cluster namespace to reference the cluster registration namespace and cluster name
    • fleet.cattle.io/cluster-group
    • fleet.cattle.io/cluster-registration-namespace
    • fleet.cattle.io/cluster-registration
    • fleet.cattle.io/commit
    • fleet.cattle.io/managed - appears unused
    • fleet.cattle.io/service-account

    Fleet agent configuration

    Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a Cluster, see Registering Downstream Cluster for more info on how to create Clusters. Default configuration will be used if these fields are not provided.

    If you change the resources limits, make sure the limits allow the fleet-agent to work normally.

    Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults. -Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    - +Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    + \ No newline at end of file diff --git a/0.7/ref-crds.html b/0.7/ref-crds.html index 1b31e162f..af6a46648 100644 --- a/0.7/ref-crds.html +++ b/0.7/ref-crds.html @@ -4,13 +4,13 @@ Custom Resources Spec | Fleet - +
    -
    Version: 0.7

    Custom Resources Spec

    Sub Resources

    GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsstringfalse
    statestringfalse
    messagestringfalse
    errorboolfalse

    Back to Custom Resources

    GitRepoResource

    FieldDescriptionSchemeRequired
    apiVersionstringfalse
    kindstringfalse
    typestringfalse
    idstringfalse
    namespacestringfalse
    namestringfalse
    incompleteStateboolfalse
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    perClusterState[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    FieldDescriptionSchemeRequired
    readyinttrue
    desiredReadyinttrue
    waitAppliedinttrue
    modifiedinttrue
    orphanedinttrue
    missinginttrue
    unknowninttrue
    notReadyinttrue

    Back to Custom Resources

    GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountstringfalse
    allowedServiceAccounts[]stringfalse
    allowedRepoPatterns[]stringfalse
    defaultClientSecretNamestringfalse
    allowedClientSecretNames[]stringfalse
    allowedTargetNamespaces[]stringfalse

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and indexstringfalse
    branchBranch The git branch to followstringfalse
    revisionRevision A specific commit or tag to operate onstringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demandstringfalse
    clientSecretNameClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for private helm repositorystringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not providedstringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default[]stringfalse
    pausedPaused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSyncboolfalse
    serviceAccountServiceAccount used in the downstream cluster for deploymentstringfalse
    targetsTargets is a list of target this repo will deploy to[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Gitint64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when new image is scanned and write back to git repoCommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepoboolfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationint64true
    commitstringfalse
    readyClustersinttrue
    desiredReadyClustersinttrue
    gitJobStatusstringfalse
    summaryBundleSummaryfalse
    displayGitRepoDisplayfalse
    conditions[]genericcondition.GenericConditionfalse
    resources[]GitRepoResourcefalse
    resourceCountsGitRepoResourceCountsfalse
    resourceErrors[]stringfalse
    lastSyncedImageScanTimemetav1.Timefalse

    Back to Custom Resources

    GitTarget

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    FieldDescriptionSchemeRequired
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    patch*GenericMapfalse
    clusterIdstringfalse

    Back to Custom Resources

    Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    stagedOptionsBundleDeploymentOptionsfalse
    stagedDeploymentIDstringfalse
    optionsBundleDeploymentOptionsfalse
    deploymentIDstringfalse
    dependsOn[]BundleReffalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false

    Back to Custom Resources

    BundleDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    statestringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    namestringfalse
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    FieldDescriptionSchemeRequired
    namestringfalse
    contentstringfalse
    encodingstringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contain the actual resources from the git repo which will be deployed.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions restrict which clusters the bundle will be deployed to.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    ignoreIgnore refers to the fields that will not be considered when monitoring the status.IgnoreOptionsfalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    newlyCreatedintfalse
    unavailableinttrue
    unavailablePartitionsinttrue
    maxUnavailableinttrue
    maxUnavailablePartitionsinttrue
    maxNewintfalse
    partitions[]PartitionStatusfalse
    displayBundleDisplayfalse
    resourceKey[]ResourceKeyfalse
    observedGenerationint64true

    Back to Custom Resources

    BundleSummary

    FieldDescriptionSchemeRequired
    notReadyintfalse
    waitAppliedintfalse
    errAppliedintfalse
    outOfSyncintfalse
    modifiedintfalse
    readyinttrue
    pendingintfalse
    desiredReadyinttrue
    nonReadyResources[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleTargetRestriction

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ComparePatch

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    operations[]Operationfalse
    jsonPointers[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    Content

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    content[]bytefalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatches[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse

    Back to Custom Resources

    KustomizeOptions

    FieldDescriptionSchemeRequired
    dirstringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    namestringtrue

    Back to Custom Resources

    ModifiedStatus

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyResource

    FieldDescriptionSchemeRequired
    namestringfalse
    bundleStateBundleStatefalse
    messagestringfalse
    modifiedStatus[]ModifiedStatusfalse
    nonReadyStatus[]NonReadyStatusfalse

    Back to Custom Resources

    NonReadyStatus

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    FieldDescriptionSchemeRequired
    opstringfalse
    pathstringfalse
    valuestringfalse

    Back to Custom Resources

    Partition

    FieldDescriptionSchemeRequired
    namestringfalse
    maxUnavailable*intstr.IntOrStringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    FieldDescriptionSchemeRequired
    namestringfalse
    countintfalse
    maxUnavailableintfalse
    unavailableintfalse
    summaryBundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse

    Back to Custom Resources

    RolloutStrategy

    FieldDescriptionSchemeRequired
    maxUnavailable*intstr.IntOrStringfalse
    maxUnavailablePartitions*intstr.IntOrStringfalse
    autoPartitionSize*intstr.IntOrStringfalse
    partitions[]Partitionfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    FieldDescriptionSchemeRequired
    overlays[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenmetav1.Timetrue
    namespacestringtrue
    nonReadyNodesinttrue
    readyNodesinttrue
    nonReadyNodeNamesAt most 3 nodes[]stringtrue
    readyNodeNamesAt most 3 nodes[]stringtrue

    Back to Custom Resources

    IgnoreOptions

    FieldDescriptionSchemeRequired
    conditionsconditions to be ignored[]map[string]stringfalse

    Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesstringfalse
    readyNodesstringfalse
    sampleNodestringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    readyBundlesstringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountinttrue
    nonReadyClusterCountinttrue
    nonReadyClusters[]stringfalse
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    displayClusterGroupDisplayfalse
    resourceCountsGitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDstringfalse
    clientRandomstringfalse
    clusterLabelsmap[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNamestringfalse
    grantedboolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttl*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expires*metav1.Timefalse
    secretNamestringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]v1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]v1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*v1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*v1.ResourceRequirementsfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summaryBundleSummaryfalse
    resourceCountsGitRepoResourceCountsfalse
    readyGitReposinttrue
    desiredReadyGitReposinttrue
    agentEnvVarsHashstringfalse
    agentPrivateRepoURLstringfalse
    agentDeployedGeneration*int64false
    agentMigratedboolfalse
    agentNamespaceMigratedboolfalse
    cattleNamespaceMigratedboolfalse
    agentAffinityHashstringfalse
    agentResourcesHashstringfalse
    agentTolerationsHashstringfalse
    displayClusterDisplayfalse
    agentAgentStatusfalse

    Back to Custom Resources

    - +
    Version: 0.7

    Custom Resources Spec

    Sub Resources

    GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsstringfalse
    statestringfalse
    messagestringfalse
    errorboolfalse

    Back to Custom Resources

    GitRepoResource

    FieldDescriptionSchemeRequired
    apiVersionstringfalse
    kindstringfalse
    typestringfalse
    idstringfalse
    namespacestringfalse
    namestringfalse
    incompleteStateboolfalse
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    perClusterState[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    FieldDescriptionSchemeRequired
    readyinttrue
    desiredReadyinttrue
    waitAppliedinttrue
    modifiedinttrue
    orphanedinttrue
    missinginttrue
    unknowninttrue
    notReadyinttrue

    Back to Custom Resources

    GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountstringfalse
    allowedServiceAccounts[]stringfalse
    allowedRepoPatterns[]stringfalse
    defaultClientSecretNamestringfalse
    allowedClientSecretNames[]stringfalse
    allowedTargetNamespaces[]stringfalse

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and indexstringfalse
    branchBranch The git branch to followstringfalse
    revisionRevision A specific commit or tag to operate onstringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demandstringfalse
    clientSecretNameClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for private helm repositorystringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not providedstringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default[]stringfalse
    pausedPaused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSyncboolfalse
    serviceAccountServiceAccount used in the downstream cluster for deploymentstringfalse
    targetsTargets is a list of target this repo will deploy to[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Gitint64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when new image is scanned and write back to git repoCommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepoboolfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationint64true
    commitstringfalse
    readyClustersinttrue
    desiredReadyClustersinttrue
    gitJobStatusstringfalse
    summaryBundleSummaryfalse
    displayGitRepoDisplayfalse
    conditions[]genericcondition.GenericConditionfalse
    resources[]GitRepoResourcefalse
    resourceCountsGitRepoResourceCountsfalse
    resourceErrors[]stringfalse
    lastSyncedImageScanTimemetav1.Timefalse

    Back to Custom Resources

    GitTarget

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    FieldDescriptionSchemeRequired
    statestringfalse
    errorboolfalse
    transitioningboolfalse
    messagestringfalse
    patch*GenericMapfalse
    clusterIdstringfalse

    Back to Custom Resources

    Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    stagedOptionsBundleDeploymentOptionsfalse
    stagedDeploymentIDstringfalse
    optionsBundleDeploymentOptionsfalse
    deploymentIDstringfalse
    dependsOn[]BundleReffalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false

    Back to Custom Resources

    BundleDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    statestringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    namestringfalse
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    FieldDescriptionSchemeRequired
    namestringfalse
    contentstringfalse
    encodingstringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contain the actual resources from the git repo which will be deployed.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions restrict which clusters the bundle will be deployed to.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    ignoreIgnore refers to the fields that will not be considered when monitoring the status.IgnoreOptionsfalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    newlyCreatedintfalse
    unavailableinttrue
    unavailablePartitionsinttrue
    maxUnavailableinttrue
    maxUnavailablePartitionsinttrue
    maxNewintfalse
    partitions[]PartitionStatusfalse
    displayBundleDisplayfalse
    resourceKey[]ResourceKeyfalse
    observedGenerationint64true

    Back to Custom Resources

    BundleSummary

    FieldDescriptionSchemeRequired
    notReadyintfalse
    waitAppliedintfalse
    errAppliedintfalse
    outOfSyncintfalse
    modifiedintfalse
    readyinttrue
    pendingintfalse
    desiredReadyinttrue
    nonReadyResources[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleTargetRestriction

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ComparePatch

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    operations[]Operationfalse
    jsonPointers[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    Content

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    content[]bytefalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatches[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse

    Back to Custom Resources

    KustomizeOptions

    FieldDescriptionSchemeRequired
    dirstringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    namestringtrue

    Back to Custom Resources

    ModifiedStatus

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyResource

    FieldDescriptionSchemeRequired
    namestringfalse
    bundleStateBundleStatefalse
    messagestringfalse
    modifiedStatus[]ModifiedStatusfalse
    nonReadyStatus[]NonReadyStatusfalse

    Back to Custom Resources

    NonReadyStatus

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    FieldDescriptionSchemeRequired
    opstringfalse
    pathstringfalse
    valuestringfalse

    Back to Custom Resources

    Partition

    FieldDescriptionSchemeRequired
    namestringfalse
    maxUnavailable*intstr.IntOrStringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    FieldDescriptionSchemeRequired
    namestringfalse
    countintfalse
    maxUnavailableintfalse
    unavailableintfalse
    summaryBundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse

    Back to Custom Resources

    RolloutStrategy

    FieldDescriptionSchemeRequired
    maxUnavailable*intstr.IntOrStringfalse
    maxUnavailablePartitions*intstr.IntOrStringfalse
    autoPartitionSize*intstr.IntOrStringfalse
    partitions[]Partitionfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    FieldDescriptionSchemeRequired
    overlays[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenmetav1.Timetrue
    namespacestringtrue
    nonReadyNodesinttrue
    readyNodesinttrue
    nonReadyNodeNamesAt most 3 nodes[]stringtrue
    readyNodeNamesAt most 3 nodes[]stringtrue

    Back to Custom Resources

    IgnoreOptions

    FieldDescriptionSchemeRequired
    conditionsconditions to be ignored[]map[string]stringfalse

    Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesstringfalse
    readyNodesstringfalse
    sampleNodestringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersstringfalse
    readyBundlesstringfalse
    statestringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountinttrue
    nonReadyClusterCountinttrue
    nonReadyClusters[]stringfalse
    conditions[]genericcondition.GenericConditionfalse
    summaryBundleSummaryfalse
    displayClusterGroupDisplayfalse
    resourceCountsGitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDstringfalse
    clientRandomstringfalse
    clusterLabelsmap[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNamestringfalse
    grantedboolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttl*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expires*metav1.Timefalse
    secretNamestringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]v1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]v1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*v1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*v1.ResourceRequirementsfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summaryBundleSummaryfalse
    resourceCountsGitRepoResourceCountsfalse
    readyGitReposinttrue
    desiredReadyGitReposinttrue
    agentEnvVarsHashstringfalse
    agentPrivateRepoURLstringfalse
    agentDeployedGeneration*int64false
    agentMigratedboolfalse
    agentNamespaceMigratedboolfalse
    cattleNamespaceMigratedboolfalse
    agentAffinityHashstringfalse
    agentResourcesHashstringfalse
    agentTolerationsHashstringfalse
    displayClusterDisplayfalse
    agentAgentStatusfalse

    Back to Custom Resources

    + \ No newline at end of file diff --git a/0.7/ref-fleet-yaml.html b/0.7/ref-fleet-yaml.html index fbb672ba2..3de073a1f 100644 --- a/0.7/ref-fleet-yaml.html +++ b/0.7/ref-fleet-yaml.html @@ -4,13 +4,13 @@ fleet.yaml | Fleet - +
    -
    Version: 0.7

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to the struct at pkg/bundlereader/read.go, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. Note, if the functions output changes with every
    # call, e.g. `uuidv4`, the bundle will get redeployed.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey

    # Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources
    # makes the Bundle to be in an error state when it shouldn't.
    ignore:
    # Conditions to be ignored
    conditions:
    # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}
    - type: Active
    status: "False"
    - +
    Version: 0.7

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to the struct at pkg/bundlereader/read.go, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. Note, if the functions output changes with every
    # call, e.g. `uuidv4`, the bundle will get redeployed.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey

    # Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources
    # makes the Bundle to be in an error state when it shouldn't.
    ignore:
    # Conditions to be ignored
    conditions:
    # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}
    - type: Active
    status: "False"
    + \ No newline at end of file diff --git a/0.7/ref-gitrepo.html b/0.7/ref-gitrepo.html index 42d605613..8154fc9f5 100644 --- a/0.7/ref-gitrepo.html +++ b/0.7/ref-gitrepo.html @@ -4,14 +4,14 @@ GitRepo Resource | Fleet - +
    Version: 0.7

    GitRepo Resource

    The GitRepo resource describes git repositories, how to access them and where the bundles are located.

    The content of the resource corresponds to the GitRepoSpec. -For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...
    - +For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...
    + \ No newline at end of file diff --git a/0.7/ref-registration.html b/0.7/ref-registration.html index 5f82ae030..b5b4ace7c 100644 --- a/0.7/ref-registration.html +++ b/0.7/ref-registration.html @@ -4,14 +4,14 @@ Cluster Registration Internals | Fleet - +
    Version: 0.7

    Cluster Registration Internals

    Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster. -It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    - +It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    + \ No newline at end of file diff --git a/0.7/ref-resources.html b/0.7/ref-resources.html index 6672d0971..2849fa6c0 100644 --- a/0.7/ref-resources.html +++ b/0.7/ref-resources.html @@ -4,13 +4,13 @@ Custom Resources | Fleet - + - +
    + \ No newline at end of file diff --git a/0.7/troubleshooting.html b/0.7/troubleshooting.html index 93409071e..0211e451a 100644 --- a/0.7/troubleshooting.html +++ b/0.7/troubleshooting.html @@ -4,7 +4,7 @@ Troubleshooting | Fleet - + @@ -12,8 +12,8 @@
    Version: 0.7

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Fetch detailed status from GitRepos and Bundles?

    For debugging and bug reports the raw JSON of the resources status fields is most useful. This can be accessed in the Rancher UI, or through kubectl:

    kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}
    kubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority"

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name>
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Agent is no longer registered

    You can force a redeployment of an agent for a given cluster by setting redeployAgentGeneration.

    kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p '[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]'

    Nested GitRepo CRs

    Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available.

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    + \ No newline at end of file diff --git a/0.7/tut-deployment.html b/0.7/tut-deployment.html index 80f158560..a76c392e0 100644 --- a/0.7/tut-deployment.html +++ b/0.7/tut-deployment.html @@ -4,7 +4,7 @@ Creating a Deployment | Fleet - + @@ -13,8 +13,8 @@ For more details on the options that are available per Git repository see Adding a GitRepo.

    Single-Cluster Examples

    All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet.

    An example using Helm. We are deploying the helm example to the local cluster.

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment:

    fleet.yaml
    namespace: fleet-helm-example

    # Custom helm options
    helm:
    # The release name to use. If empty a generated release name will be used
    releaseName: guestbook

    # The directory of the chart in the repo. Also any valid go-getter supported
    # URL can be used there is specify where to download the chart from.
    # If repo below is set this value if the chart name in the repo
    chart: ""

    # An https to a valid Helm repository to download the chart from
    repo: ""

    # Used if repo is set to look up the version of the chart
    version: ""

    # Force recreate resource that can not be updated
    force: false

    # How long for helm to wait for the release to be active. If the value
    # is less that or equal to zero, we will not wait in Helm
    timeoutSeconds: 0

    # Custom values that will be passed as values.yaml to the installation
    values:
    replicas: 2

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-local namespace contains the local cluster resource. The local fleet-agent will create the deployment in the fleet-helm-example namespace.

    kubectl apply -n fleet-local -f - <<EOF
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - single-cluster/helm
    EOF

    Multi-Cluster Examples

    The examples below will deploy a multi git repo to multiple clusters at once and configure the app differently for each target.

    An example using Helm. We are deploying the helm example and customizing it per target cluster

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment. The fleet.yaml is used to configure different deployment options, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-helm-example
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/helm
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod

    By applying the gitrepo resource to the upstream cluster, fleet will start to monitor the repository and create deployments:

    kubectl apply -n fleet-default -f gitrepo.yaml
    - +The application will be customized as follows per environment:

    • Dev clusters: Only the redis leader is deployed and not the followers.
    • Test clusters: Scale the front deployment to 3
    • Prod clusters: Scale the front deployment to 3 and set the service type to LoadBalancer

    The fleet.yaml is used to control which 'yaml' overlays are used, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-manifest-example
    targetCustomizations:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev
    yaml:
    overlays:
    # Refers to overlays/noreplication folder
    - noreplication

    - name: test
    clusterSelector:
    matchLabels:
    env: test
    yaml:
    overlays:
    # Refers to overlays/scale3 folder
    - scale3

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    yaml:
    # Refers to overlays/servicelb, scale3 folders
    overlays:
    - servicelb
    - scale3

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: manifests
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/manifests
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    kubectl apply -n fleet-default -f gitrepo.yaml
    + \ No newline at end of file diff --git a/0.7/uninstall.html b/0.7/uninstall.html index 1cfac6f5a..fa4b69cf1 100644 --- a/0.7/uninstall.html +++ b/0.7/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - + - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    caution

    Uninstalling the CRDs will remove all deployed workloads.

    + \ No newline at end of file diff --git a/0.7/webhook.html b/0.7/webhook.html index c3442df99..6c645e529 100644 --- a/0.7/webhook.html +++ b/0.7/webhook.html @@ -4,7 +4,7 @@ Using Webhooks Instead of Polling | Fleet - + @@ -12,8 +12,8 @@
    Version: 0.7

    Using Webhooks Instead of Polling

    By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file diff --git a/0.8.html b/0.8.html index 9c1c5dd0a..2b174c535 100644 --- a/0.8.html +++ b/0.8.html @@ -4,13 +4,13 @@ Overview | Fleet - +
    -
    Version: 0.8

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    - +
    Version: 0.8

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    + \ No newline at end of file diff --git a/0.8/architecture.html b/0.8/architecture.html index 0c0657d46..3be2544b8 100644 --- a/0.8/architecture.html +++ b/0.8/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

    The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    - +subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    + \ No newline at end of file diff --git a/0.8/bundle-add.html b/0.8/bundle-add.html index e6c505b1a..7e02a36e8 100644 --- a/0.8/bundle-add.html +++ b/0.8/bundle-add.html @@ -4,7 +4,7 @@ Create a Bundle Resource | Fleet - + @@ -15,8 +15,8 @@ manually by the user. If you want to deploy resources from a git repository use When creating a Bundle resources need to be explicitly specified in the Bundle Spec. Resources can be compressed with gz. See here an example of how Rancher uses compression in go code.

    If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in GitRepo. -See Mapping to Downstream Clusters.

    The following example creates a nginx Deployment in the local cluster:

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    resources:
    # List of all resources that will be deployed
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml
    targets:
    - clusterName: local

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    Convert a Helm Chart into a Bundle

    You can use the Fleet CLI to convert a Helm chart into a bundle.

    For example, you can download and convert the "external secrets" operator chart like this:

    cat > targets.yaml <<EOF
    targets:
    - clusterSelector: {}
    EOF

    mkdir app
    cat > app/fleet.yaml <<EOF
    defaultNamespace: external-secrets
    helm:
    repo: https://charts.external-secrets.io
    chart: external-secrets
    EOF

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

    kubectl apply -f eso-bundle.yaml

    Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

    The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

    - +See Mapping to Downstream Clusters.

    The following example creates a nginx Deployment in the local cluster:

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    resources:
    # List of all resources that will be deployed
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml
    targets:
    - clusterName: local

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    Convert a Helm Chart into a Bundle

    You can use the Fleet CLI to convert a Helm chart into a bundle.

    For example, you can download and convert the "external secrets" operator chart like this:

    cat > targets.yaml <<EOF
    targets:
    - clusterSelector: {}
    EOF

    mkdir app
    cat > app/fleet.yaml <<EOF
    defaultNamespace: external-secrets
    helm:
    repo: https://charts.external-secrets.io
    chart: external-secrets
    EOF

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

    kubectl apply -f eso-bundle.yaml

    Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

    The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

    + \ No newline at end of file diff --git a/0.8/bundle-diffs.html b/0.8/bundle-diffs.html index 65f375fc0..d55f435fa 100644 --- a/0.8/bundle-diffs.html +++ b/0.8/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs to Ignore Modified GitRepos | Fleet - +
    Version: 0.8

    Generating Diffs to Ignore Modified GitRepos

    Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

    You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

    The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

    This leads the status of the bundle and associated GitRepo to be reported as "Modified"

    Associated Bundle -

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

    https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    - +

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

    https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    + \ No newline at end of file diff --git a/0.8/changelogs.html b/0.8/changelogs.html index 003abd4c6..fffb4c355 100644 --- a/0.8/changelogs.html +++ b/0.8/changelogs.html @@ -4,13 +4,13 @@ 0.8 Changelogs | Fleet - +
    -
    - +
    + \ No newline at end of file diff --git a/0.8/changelogs/changelogs/v0.8.0.html b/0.8/changelogs/changelogs/v0.8.0.html index e554c2bf9..42eb9eece 100644 --- a/0.8/changelogs/changelogs/v0.8.0.html +++ b/0.8/changelogs/changelogs/v0.8.0.html @@ -4,13 +4,13 @@ v0.8.0 | Fleet - +
    -
    Version: 0.8

    v0.8.0

    • (rancherio-gh-m) released this 2023-09-11 15:05:53 +0000 UTC*

    Description

    Notes on 0.8.0

    Additions

    • Allow helm credentials to be defined for each path by @raulcabello in #1557
    • Add cluster name and namespace to BundleDeployment by @manno in #1571
    • Add DoNotDeploy and OverrideTargets by @raulcabello in #1580
    • Drift correction by @raulcabello in #1594
    • Add helm release resources to bd status by @manno in #1596
    • Add NamespaceLabels and NamespaceAnnotations by @raulcabello in #1627
    • Support exclusion of files and directories from bundles via .fleetignore by @weyfonk in #1634
    • Add hook on upgrade to clean up old, duplicate clusterregistrations by @manno in #1689
      • Cleanup command takes string durations as arguments by @manno in #1697
    • Clean up old clusterregistrations and remember cluster's api server by @manno in #1658
      • Clusteregistration less aggressive cleanup by @manno in #1675
      • Return early from clusterregistration handler by @manno in #1676
    • Restrict registration to leader agent by @manno in #1687
    • Do not restart agents when adopting them with a bundle by @manno in #1678

    Bugfixes

    • Agent registration recovery by @manno in #1567
    • Use correct string comparison in gitjob update script by @thardeck in #1610
    • Reduce Helm history to two entries by default by @moio in #1607
    • Fix Helm release name generation to prevent double dashes by @weyfonk in #1647
    • Prevent non-hex chars in release name hash by @weyfonk in #1649
    • Enforce strict match on cluster name when fetching bundledeployments by cluster by @weyfonk in #1662

    What's Changed

    Full Changelog: v0.7.1...v0.8.0

    Download

    Information retrieved from here

    - +
    Version: 0.8

    v0.8.0

    • (rancherio-gh-m) released this 2023-09-11 15:05:53 +0000 UTC*

    Description

    Notes on 0.8.0

    Additions

    • Allow helm credentials to be defined for each path by @raulcabello in #1557
    • Add cluster name and namespace to BundleDeployment by @manno in #1571
    • Add DoNotDeploy and OverrideTargets by @raulcabello in #1580
    • Drift correction by @raulcabello in #1594
    • Add helm release resources to bd status by @manno in #1596
    • Add NamespaceLabels and NamespaceAnnotations by @raulcabello in #1627
    • Support exclusion of files and directories from bundles via .fleetignore by @weyfonk in #1634
    • Add hook on upgrade to clean up old, duplicate clusterregistrations by @manno in #1689
      • Cleanup command takes string durations as arguments by @manno in #1697
    • Clean up old clusterregistrations and remember cluster's api server by @manno in #1658
      • Clusteregistration less aggressive cleanup by @manno in #1675
      • Return early from clusterregistration handler by @manno in #1676
    • Restrict registration to leader agent by @manno in #1687
    • Do not restart agents when adopting them with a bundle by @manno in #1678

    Bugfixes

    • Agent registration recovery by @manno in #1567
    • Use correct string comparison in gitjob update script by @thardeck in #1610
    • Reduce Helm history to two entries by default by @moio in #1607
    • Fix Helm release name generation to prevent double dashes by @weyfonk in #1647
    • Prevent non-hex chars in release name hash by @weyfonk in #1649
    • Enforce strict match on cluster name when fetching bundledeployments by cluster by @weyfonk in #1662

    What's Changed

    Full Changelog: v0.7.1...v0.8.0

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.8/changelogs/changelogs/v0.8.1.html b/0.8/changelogs/changelogs/v0.8.1.html index 8e7596c35..288ff257b 100644 --- a/0.8/changelogs/changelogs/v0.8.1.html +++ b/0.8/changelogs/changelogs/v0.8.1.html @@ -4,13 +4,13 @@ v0.8.1 | Fleet - +
    -
    Version: 0.8
    - +
    Version: 0.8
    + \ No newline at end of file diff --git a/0.8/changelogs/changelogs/v0.8.2.html b/0.8/changelogs/changelogs/v0.8.2.html index e7b2cc851..6a235767c 100644 --- a/0.8/changelogs/changelogs/v0.8.2.html +++ b/0.8/changelogs/changelogs/v0.8.2.html @@ -4,13 +4,13 @@ v0.8.2 | Fleet - +
    -
    Version: 0.8

    v0.8.2

    • (rancherio-gh-m) released this 2024-02-22 09:30:48 +0000 UTC*

    Description

    Notes

    Additions

    Performance

    • Use index when listing BundleDeployments by Bundle by @aruiz14 in #1859
    • Replace json-based implementation of DeepCopy on GenericMap by @aruiz14 in #1956
    • Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by @aruiz14 in #2055

    Bugfixes

    • Initialise cluster registration labels map if empty by @weyfonk in #2063

    What's Changed

    Full Changelog: v0.8.1...v0.8.2

    Gitjob

    Gitjob Full Changelog: rancher/gitjob@v0.1.76-security1...v0.8.2

    Download

    Information retrieved from here

    - +
    Version: 0.8

    v0.8.2

    • (rancherio-gh-m) released this 2024-02-22 09:30:48 +0000 UTC*

    Description

    Notes

    Additions

    Performance

    • Use index when listing BundleDeployments by Bundle by @aruiz14 in #1859
    • Replace json-based implementation of DeepCopy on GenericMap by @aruiz14 in #1956
    • Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by @aruiz14 in #2055

    Bugfixes

    • Initialise cluster registration labels map if empty by @weyfonk in #2063

    What's Changed

    Full Changelog: v0.8.1...v0.8.2

    Gitjob

    Gitjob Full Changelog: rancher/gitjob@v0.1.76-security1...v0.8.2

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.8/changelogs/changelogs/v0.8.3.html b/0.8/changelogs/changelogs/v0.8.3.html index 3f4739130..01de67562 100644 --- a/0.8/changelogs/changelogs/v0.8.3.html +++ b/0.8/changelogs/changelogs/v0.8.3.html @@ -4,13 +4,13 @@ v0.8.3 | Fleet - +
    -
    Version: 0.8

    v0.8.3

    • (rancherio-gh-m) released this 2024-03-19 10:04:05 +0000 UTC*

    Description

    Bugfixes

    • Add support for Azure DevOps Webhook for gitRepos using SSH URL by @p-se in rancher/gitjob#453
    • Bump google.golang.org/protobuf from 1.31.0 to 1.33.0 by @thardeck in #2228
    • Convert TestAzureDevopsWebhookWithSSHURL to support Wrangler v1.1.1 by @thardeck in #2228

    What's Changed

    Full Changelog: v0.8.2...v0.8.3

    Download

    Information retrieved from here

    - +
    Version: 0.8

    v0.8.3

    • (rancherio-gh-m) released this 2024-03-19 10:04:05 +0000 UTC*

    Description

    Bugfixes

    • Add support for Azure DevOps Webhook for gitRepos using SSH URL by @p-se in rancher/gitjob#453
    • Bump google.golang.org/protobuf from 1.31.0 to 1.33.0 by @thardeck in #2228
    • Convert TestAzureDevopsWebhookWithSSHURL to support Wrangler v1.1.1 by @thardeck in #2228

    What's Changed

    Full Changelog: v0.8.2...v0.8.3

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.8/changelogs/changelogs/v0.8.4.html b/0.8/changelogs/changelogs/v0.8.4.html index d0482e5a1..705fe4108 100644 --- a/0.8/changelogs/changelogs/v0.8.4.html +++ b/0.8/changelogs/changelogs/v0.8.4.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.8
    • (rancherio-gh-m) released this 2024-05-02 12:18:29 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.8.3...v0.8.4

    Download

    Information retrieved from here

    - +
    Version: 0.8
    • (rancherio-gh-m) released this 2024-05-02 12:18:29 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.8.3...v0.8.4

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.8/changelogs/changelogs/v0.8.5.html b/0.8/changelogs/changelogs/v0.8.5.html index c1fa75cca..08ec08c74 100644 --- a/0.8/changelogs/changelogs/v0.8.5.html +++ b/0.8/changelogs/changelogs/v0.8.5.html @@ -4,13 +4,13 @@ v0.8.5 | Fleet - +
    -
    Version: 0.8
    - +
    Version: 0.8
    + \ No newline at end of file diff --git a/0.8/cli/fleet-agent.html b/0.8/cli/fleet-agent.html index 862389336..171464428 100644 --- a/0.8/cli/fleet-agent.html +++ b/0.8/cli/fleet-agent.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.8

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string        An identifier used to scope the agent bundleID names, typically the same as namespace
    --checkin-interval string How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch
    --simulators int Numbers of simulators to run
    - +
    Version: 0.8

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string        An identifier used to scope the agent bundleID names, typically the same as namespace
    --checkin-interval string How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch
    --simulators int Numbers of simulators to run
    + \ No newline at end of file diff --git a/0.8/cli/fleet-cli/fleet.html b/0.8/cli/fleet-cli/fleet.html index 67095fd87..e03d27d27 100644 --- a/0.8/cli/fleet-cli/fleet.html +++ b/0.8/cli/fleet-cli/fleet.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.8

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet test - Match a bundle to a target and render the output
    - +
    Version: 0.8

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet test - Match a bundle to a target and render the output
    + \ No newline at end of file diff --git a/0.8/cli/fleet-cli/fleet_apply.html b/0.8/cli/fleet-cli/fleet_apply.html index 9ffd45cd4..5df46198e 100644 --- a/0.8/cli/fleet-cli/fleet_apply.html +++ b/0.8/cli/fleet-cli/fleet_apply.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.8

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string           Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -h, --help help for apply
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Version: 0.8

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string           Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -h, --help help for apply
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.8/cli/fleet-cli/fleet_test.html b/0.8/cli/fleet-cli/fleet_test.html index d1f505d18..818ca0b37 100644 --- a/0.8/cli/fleet-cli/fleet_test.html +++ b/0.8/cli/fleet-cli/fleet_test.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.8

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Version: 0.8

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.8/cli/fleet-controller/fleet-manager.html b/0.8/cli/fleet-controller/fleet-manager.html index f5b1c893d..10e0a40de 100644 --- a/0.8/cli/fleet-controller/fleet-manager.html +++ b/0.8/cli/fleet-controller/fleet-manager.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.8

    fleet-manager

    fleet-manager [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-bootstrap disable agent on local cluster
    --disable-gitops disable gitops components
    -h, --help help for fleet-manager
    --kubeconfig string Kubeconfig file
    --namespace string namespace to watch (default "cattle-fleet-system")
    - +
    Version: 0.8

    fleet-manager

    fleet-manager [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-bootstrap disable agent on local cluster
    --disable-gitops disable gitops components
    -h, --help help for fleet-manager
    --kubeconfig string Kubeconfig file
    --namespace string namespace to watch (default "cattle-fleet-system")
    + \ No newline at end of file diff --git a/0.8/cluster-bundles-state.html b/0.8/cluster-bundles-state.html index 39419ee50..bfd1aaba1 100644 --- a/0.8/cluster-bundles-state.html +++ b/0.8/cluster-bundles-state.html @@ -4,13 +4,13 @@ Cluster and Bundle State | Fleet - +
    -
    Version: 0.8

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    - +
    Version: 0.8

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    + \ No newline at end of file diff --git a/0.8/cluster-group.html b/0.8/cluster-group.html index b356fe2a0..76c876844 100644 --- a/0.8/cluster-group.html +++ b/0.8/cluster-group.html @@ -4,7 +4,7 @@ Create Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    - +status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    + \ No newline at end of file diff --git a/0.8/cluster-registration.html b/0.8/cluster-registration.html index 81ea08783..569c671bc 100644 --- a/0.8/cluster-registration.html +++ b/0.8/cluster-registration.html @@ -4,7 +4,7 @@ Register Downstream Clusters | Fleet - + @@ -75,8 +75,8 @@ above example one can run the following one-liner:

    info

    If you are using Fleet standalone without Rancher, it must be installed as described in installation details.

    The manager-initiated registration is used when you add a cluster from the Rancher dashboard.

    Create Kubeconfig Secret

    The format of this secret is intended to match the format of the kubeconfig secret used in cluster-api. -This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    - +This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    + \ No newline at end of file diff --git a/0.8/concepts.html b/0.8/concepts.html index 1e7b27a6e..30167b68d 100644 --- a/0.8/concepts.html +++ b/0.8/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

    • To see the life cycle of a bundle, click here.
  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/0.8/gitrepo-add.html b/0.8/gitrepo-add.html index 2b931bb7b..1a7ad7eef 100644 --- a/0.8/gitrepo-add.html +++ b/0.8/gitrepo-add.html @@ -4,7 +4,7 @@ Create a GitRepo Resource | Fleet - + @@ -15,8 +15,8 @@ Make sure you don't leak credentials by mixing public and private repositor or split them into different gitrepos, or use helmRepoURLRegex to limit the scope of credentials to certain servers.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Use different helm credentials for each path

    info

    gitRepo.spec.helmSecretName will be ignored if gitRepo.spec.helmSecretNameForPaths is provided

    Create a file secrets-path.yaml that contains credentials for each path defined in a GitRepo. Credentials will not be used for paths that are not present in this file. The path is the actual path to the bundle (ie to a folder containing a fleet.yaml file) within the git repository, which might have more segments than the entry under paths:.

    Example:

    path-one: # path path-one must exist in the repository
    username: user
    password: pass
    path-two: # path path-one must exist in the repository
    username: user2
    password: pass2
    caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
    sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K

    Create the secret

    kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml

    In the previous example credentials for username user will be used for the path path-one and credentials for username -user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/0.8/gitrepo-content.html b/0.8/gitrepo-content.html index 064de098a..a3c55a3f8 100644 --- a/0.8/gitrepo-content.html +++ b/0.8/gitrepo-content.html @@ -4,7 +4,7 @@ Git Repository Contents | Fleet - + @@ -51,8 +51,8 @@ the contents of a file the convention of adding _patch. (notice the will be replaced with . from the file name and that will be used as the target. For example deployment_patch.yaml will target deployment.yaml. The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch. Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written -using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    - +using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    + \ No newline at end of file diff --git a/0.8/gitrepo-targets.html b/0.8/gitrepo-targets.html index 5208ad692..7a9cb33b6 100644 --- a/0.8/gitrepo-targets.html +++ b/0.8/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -23,8 +23,8 @@ and add clusters to it.

    this issue for more details.

  • Helm.WaitForJobs

  • Kustomize.Dir

  • YAML.Overlays

  • Diff.ComparePatches

  • Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/0.8/imagescan.html b/0.8/imagescan.html index 919bdffcc..84f03325d 100644 --- a/0.8/imagescan.html +++ b/0.8/imagescan.html @@ -4,15 +4,15 @@ Using Image Scan to Update Container Image References | Fleet - +
    Version: 0.8

    Using Image Scan to Update Container Image References

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/0.8/installation.html b/0.8/installation.html index aa10e1690..eb8aaa54e 100644 --- a/0.8/installation.html +++ b/0.8/installation.html @@ -4,7 +4,7 @@ Installation Details | Fleet - + @@ -37,8 +37,8 @@ the ca.pem is not correct. The contents of the $API_SERVER_CA and the CA certificate is in the file ca.pem. If your API server URL is signed by a well-known CA you can omit the apiServerCA parameter below or just create an empty ca.pem file (ie touch ca.pem).

    Setup the environment with your specific values, e.g.:

    API_SERVER_URL="https://example.com:6443"
    API_SERVER_CA="ca.pem"

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First add Fleet's Helm repository.
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Second install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd

    Third install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="$API_SERVER_URL" \
    --set-file apiServerCA="$API_SERVER_CA" \
    fleet

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/0.8/multi-user.html b/0.8/multi-user.html index 0baa6bd1f..667c40654 100644 --- a/0.8/multi-user.html +++ b/0.8/multi-user.html @@ -4,7 +4,7 @@ Setup Multi User | Fleet - + @@ -17,8 +17,8 @@ deploy cluster wide resources. Even with the available Fleet restrictions, users are only restricted to namespaces, but namespaces don't provide much isolation on their own. E.g. they can still consume as many resources as they like.

    However, the existing Fleet restrictions allow users to share clusters, and -deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    - +deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    + \ No newline at end of file diff --git a/0.8/namespaces.html b/0.8/namespaces.html index 70d7b190d..100870429 100644 --- a/0.8/namespaces.html +++ b/0.8/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -39,8 +39,8 @@ in an error state and won't be deployed.

    This can also be used to set If an allowedTargetNamespaces restriction is present, all GitRepos must specify a targetNamespace and the specified namespace must be in the allow list. -This also prevents the creation of cluster wide resources.

    - +This also prevents the creation of cluster wide resources.

    + \ No newline at end of file diff --git a/0.8/quickstart.html b/0.8/quickstart.html index 5508b5cb2..a7786ade3 100644 --- a/0.8/quickstart.html +++ b/0.8/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Version: 0.8

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is fairly straightforward. To install the Helm 3 CLI follow the official install instructions.

    Fleet in Rancher

    Rancher has separate helm charts for Fleet and uses a different repository.

    brew install helm
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
    helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet

    Add a Git Repo to Watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be ran in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be ran in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/0.8/ref-bundle-stages.html b/0.8/ref-bundle-stages.html index 91efbdf89..3aa07bae6 100644 --- a/0.8/ref-bundle-stages.html +++ b/0.8/ref-bundle-stages.html @@ -4,13 +4,13 @@ Bundle Lifecycle | Fleet - +
    -
    Version: 0.8

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    - +
    Version: 0.8

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    + \ No newline at end of file diff --git a/0.8/ref-bundle.html b/0.8/ref-bundle.html index 462c65b68..bdf889718 100644 --- a/0.8/ref-bundle.html +++ b/0.8/ref-bundle.html @@ -4,14 +4,14 @@ Bundle Resource | Fleet - +
    Version: 0.8

    Bundle Resource

    Bundles are automatically created by Fleet when a GitRepo is created.

    The content of the resource corresponds to the BundleSpec. -For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    - +For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    + \ No newline at end of file diff --git a/0.8/ref-configuration.html b/0.8/ref-configuration.html index 3cf4dd51a..4d76bbbcf 100644 --- a/0.8/ref-configuration.html +++ b/0.8/ref-configuration.html @@ -4,7 +4,7 @@ Configuration | Fleet - + @@ -12,8 +12,8 @@
    Version: 0.8

    Configuration

    A reference list of, mostly internal, configuration options.

    Helm Charts

    The Helm charts accept, at least, the options as shown with their default in values.yaml:

    Environment Variables

    The controllers can be started with these environment variables:

    • CATTLE_DEV_MODE - used to debug wrangler, not usable
    • FLEET_CLUSTER_ENQUEUE_DELAY - tune how often non-ready clusters are checked
    • FLEET_CPU_PPROF_PERIOD - used to turn on performance profiling

    Configuration

    In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments.

    The config struct is used in both config maps:

    • cattle-fleet-system/fleet-agent
    • cattle-fleet-system/fleet-controller

    Labels

    Labels used by fleet:

    • fleet.cattle.io/agent=true - NodeSelector label for agent's deployment affinity setting
    • fleet.cattle.io/non-managed-agent - managed agent bundle won't target Clusters with this label
    • fleet.cattle.io/repo-name - used on Bundle to reference the git repo resource
    • fleet.cattle.io/bundle-namespace - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/bundle-name - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/managed=true - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces.
    • fleet.cattle.io/bootstrap-token - unused

    Annotations

    Annotations used by fleet:

    • fleet.cattle.io/agent-namespace
    • fleet.cattle.io/bundle-id
    • fleet.cattle.io/cluster, fleet.cattle.io/cluster-namespace - used on a cluster namespace to reference the cluster registration namespace and cluster name
    • fleet.cattle.io/cluster-group
    • fleet.cattle.io/cluster-registration-namespace
    • fleet.cattle.io/cluster-registration
    • fleet.cattle.io/commit
    • fleet.cattle.io/managed - appears unused
    • fleet.cattle.io/service-account

    Fleet agent configuration

    Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a Cluster, see Registering Downstream Cluster for more info on how to create Clusters. Default configuration will be used if these fields are not provided.

    If you change the resources limits, make sure the limits allow the fleet-agent to work normally.

    Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults. -Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    - +Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    + \ No newline at end of file diff --git a/0.8/ref-crds.html b/0.8/ref-crds.html index b182943f5..23b875f3b 100644 --- a/0.8/ref-crds.html +++ b/0.8/ref-crds.html @@ -4,13 +4,13 @@ Custom Resources Spec | Fleet - +
    -
    Version: 0.8

    Custom Resources Spec

    Sub Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.CorrectDriftfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    commitCommit is the Git commit hash from the last gitjob run.stringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last GitJob run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.\n\nWhen a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.CorrectDriftfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes Fleet skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue
    nonReadyNodesNonReadyNodes is the number of nodes that are not ready.inttrue
    readyNodesReadyNodes is the number of nodes that are ready.inttrue
    nonReadyNodeNamesNonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names.[]stringtrue
    readyNodeNamesReadyNodes contains the names of ready nodes. The list is limited to at most 3 names.[]stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    readyNodesReadyNodes is a string in the form \"%d/%d\", that describes the number of nodes that are ready vs. the number of expected nodes.stringfalse
    sampleNodeSampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]v1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]v1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*v1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*v1.ResourceRequirementsfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse

    Back to Custom Resources

    - +
    Version: 0.8

    Custom Resources Spec

    Sub Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.CorrectDriftfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    commitCommit is the Git commit hash from the last gitjob run.stringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last GitJob run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.\n\nWhen a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.CorrectDriftfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    BundleDeploymentOptionsBundleDeploymentOptionsfalse
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes Fleet skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue
    nonReadyNodesNonReadyNodes is the number of nodes that are not ready.inttrue
    readyNodesReadyNodes is the number of nodes that are ready.inttrue
    nonReadyNodeNamesNonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names.[]stringtrue
    readyNodeNamesReadyNodes contains the names of ready nodes. The list is limited to at most 3 names.[]stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    readyNodesReadyNodes is a string in the form \"%d/%d\", that describes the number of nodes that are ready vs. the number of expected nodes.stringfalse
    sampleNodeSampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]v1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]v1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*v1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*v1.ResourceRequirementsfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse

    Back to Custom Resources

    + \ No newline at end of file diff --git a/0.8/ref-fleet-yaml.html b/0.8/ref-fleet-yaml.html index 340ec5e37..a7a62f6a3 100644 --- a/0.8/ref-fleet-yaml.html +++ b/0.8/ref-fleet-yaml.html @@ -4,13 +4,13 @@ fleet.yaml | Fleet - +
    -
    Version: 0.8

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to the struct at pkg/bundlereader/read.go, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # namespaceLabels are labels that will be appended to the namespace created by Fleet.
    namespaceLabels:
    key: value
    # namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.
    namespaceAnnotations:
    key: value

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    ### These options control how "fleet apply" downloads the chart
    #
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0

    ### These options only work for helm-type bundles
    #
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. Note, if the functions output changes with every
    # call, e.g. `uuidv4`, the bundle will get redeployed.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml

    ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.
    #
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name. When using Fleet in
    # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1
    # Resources will not be deployed in the matched clusters if doNotDeploy is true.
    doNotDeploy: false

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:
    # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey

    # Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources
    # makes the Bundle to be in an error state when it shouldn't.
    ignore:
    # Conditions to be ignored
    conditions:
    # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}
    - type: Active
    status: "False"

    # Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.
    overrideTargets:
    - clusterSelector:
    matchLabels:
    env: dev

    - +
    Version: 0.8

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to the struct at pkg/bundlereader/read.go, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # namespaceLabels are labels that will be appended to the namespace created by Fleet.
    namespaceLabels:
    key: value
    # namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.
    namespaceAnnotations:
    key: value

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    ### These options control how "fleet apply" downloads the chart
    #
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0

    ### These options only work for helm-type bundles
    #
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. Note, if the functions output changes with every
    # call, e.g. `uuidv4`, the bundle will get redeployed.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml

    ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.
    #
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name. When using Fleet in
    # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1
    # Resources will not be deployed in the matched clusters if doNotDeploy is true.
    doNotDeploy: false

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:
    # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey

    # Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources
    # makes the Bundle to be in an error state when it shouldn't.
    ignore:
    # Conditions to be ignored
    conditions:
    # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}
    - type: Active
    status: "False"

    # Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.
    overrideTargets:
    - clusterSelector:
    matchLabels:
    env: dev

    + \ No newline at end of file diff --git a/0.8/ref-gitrepo.html b/0.8/ref-gitrepo.html index 250f6bd3c..bb2a7a32e 100644 --- a/0.8/ref-gitrepo.html +++ b/0.8/ref-gitrepo.html @@ -4,14 +4,14 @@ GitRepo Resource | Fleet - +
    Version: 0.8

    GitRepo Resource

    The GitRepo resource describes git repositories, how to access them and where the bundles are located.

    The content of the resource corresponds to the GitRepoSpec. -For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...
    #
    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    - +For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...
    #
    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    + \ No newline at end of file diff --git a/0.8/ref-registration.html b/0.8/ref-registration.html index 1ea1317ca..ea14e11fe 100644 --- a/0.8/ref-registration.html +++ b/0.8/ref-registration.html @@ -4,7 +4,7 @@ Cluster Registration Internals | Fleet - + @@ -14,8 +14,8 @@ The import.go will enqueue itself until the import service account exists, because that’s needed to create the fleet-agent-bootstrap secret. Now, the fleet-agent and the bootstrap secret are present on the downstream cluster

    Fleet-Agent -> ClusterRegistration

    Immediately the fleet-agent checks for a fleet-agent-bootstrap secret (which contains the import kubeconfig) and starts registering if present. Then fleet-agent creates a clusterregistration resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret’s name.

    fleet-controller triggers and tries to grant the clusterregistration request to create fleet-agent’s serviceaccount and create the ‘c-*’ registration secret with the clients new kubeconfig. The registration secret name is hash("clientID-clientRandom"). The new kubeconfig uses the "request" account. The request account can access the cluster status, bundledeployments and contents.

    Notes

    • The registration starts with the "import" account and pivots to the "request" account.
    • The fleet-default namespace has all the cluster registrations, the import account uses a separate namespace.
    • Once the agent is registered, fleet-controller will trigger on a cluster/namespace change and call manageagent to create a bundle. The agent will update itself to the bundle and since the generation env var changes it will restart.
    • If no bootstrap secret exists, the agent will not re-register.

    Diagram

    Process

    Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster. -It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    Secrets

    This diagram shows the resources created during registration and focuses on the k8s API server configuration.

    Registration Secrets

    - +It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    Secrets

    This diagram shows the resources created during registration and focuses on the k8s API server configuration.

    Registration Secrets

    + \ No newline at end of file diff --git a/0.8/ref-resources.html b/0.8/ref-resources.html index 6f0b38565..a5b8dce46 100644 --- a/0.8/ref-resources.html +++ b/0.8/ref-resources.html @@ -4,13 +4,13 @@ List of Deployed Resources | Fleet - +
    -
    Version: 0.8

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    - +
    Version: 0.8

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    + \ No newline at end of file diff --git a/0.8/resources-during-deployment.html b/0.8/resources-during-deployment.html index d3f024cf2..45202abdb 100644 --- a/0.8/resources-during-deployment.html +++ b/0.8/resources-during-deployment.html @@ -4,13 +4,13 @@ Custom Resources During Deployment | Fleet - + - +
    + \ No newline at end of file diff --git a/0.8/troubleshooting.html b/0.8/troubleshooting.html index 806cd329a..d52bff49a 100644 --- a/0.8/troubleshooting.html +++ b/0.8/troubleshooting.html @@ -4,7 +4,7 @@ Troubleshooting | Fleet - + @@ -12,8 +12,8 @@
    Version: 0.8

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Fetch detailed status from GitRepos and Bundles?

    For debugging and bug reports the raw JSON of the resources status fields is most useful. This can be accessed in the Rancher UI, or through kubectl:

    kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}
    kubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority"

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name>
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Agent is no longer registered

    You can force a redeployment of an agent for a given cluster by setting redeployAgentGeneration.

    kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p '[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]'

    Nested GitRepo CRs

    Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available.

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    + \ No newline at end of file diff --git a/0.8/tut-deployment.html b/0.8/tut-deployment.html index 3b285341d..c4f1bf806 100644 --- a/0.8/tut-deployment.html +++ b/0.8/tut-deployment.html @@ -4,7 +4,7 @@ Creating a Deployment | Fleet - + @@ -13,8 +13,8 @@ For more details on the options that are available per Git repository see Adding a GitRepo.

    Single-Cluster Examples

    All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet.

    An example using Helm. We are deploying the helm example to the local cluster.

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment:

    fleet.yaml
    namespace: fleet-helm-example

    # Custom helm options
    helm:
    # The release name to use. If empty a generated release name will be used
    releaseName: guestbook

    # The directory of the chart in the repo. Also any valid go-getter supported
    # URL can be used there is specify where to download the chart from.
    # If repo below is set this value if the chart name in the repo
    chart: ""

    # An https to a valid Helm repository to download the chart from
    repo: ""

    # Used if repo is set to look up the version of the chart
    version: ""

    # Force recreate resource that can not be updated
    force: false

    # How long for helm to wait for the release to be active. If the value
    # is less that or equal to zero, we will not wait in Helm
    timeoutSeconds: 0

    # Custom values that will be passed as values.yaml to the installation
    values:
    replicas: 2

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-local namespace contains the local cluster resource. The local fleet-agent will create the deployment in the fleet-helm-example namespace.

    kubectl apply -n fleet-local -f - <<EOF
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - single-cluster/helm
    EOF

    Multi-Cluster Examples

    The examples below will deploy a multi git repo to multiple clusters at once and configure the app differently for each target.

    An example using Helm. We are deploying the helm example and customizing it per target cluster

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment. The fleet.yaml is used to configure different deployment options, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-helm-example
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/helm
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod

    By applying the gitrepo resource to the upstream cluster, fleet will start to monitor the repository and create deployments:

    kubectl apply -n fleet-default -f gitrepo.yaml
    - +The application will be customized as follows per environment:

    • Dev clusters: Only the redis leader is deployed and not the followers.
    • Test clusters: Scale the front deployment to 3
    • Prod clusters: Scale the front deployment to 3 and set the service type to LoadBalancer

    The fleet.yaml is used to control which 'yaml' overlays are used, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-manifest-example
    targetCustomizations:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev
    yaml:
    overlays:
    # Refers to overlays/noreplication folder
    - noreplication

    - name: test
    clusterSelector:
    matchLabels:
    env: test
    yaml:
    overlays:
    # Refers to overlays/scale3 folder
    - scale3

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    yaml:
    # Refers to overlays/servicelb, scale3 folders
    overlays:
    - servicelb
    - scale3

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: manifests
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/manifests
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    kubectl apply -n fleet-default -f gitrepo.yaml
    + \ No newline at end of file diff --git a/0.8/uninstall.html b/0.8/uninstall.html index 25ab4293f..b9e8725af 100644 --- a/0.8/uninstall.html +++ b/0.8/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - + - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    caution

    Uninstalling the CRDs will remove all deployed workloads.

    + \ No newline at end of file diff --git a/0.8/webhook.html b/0.8/webhook.html index e3d871147..4b8f8b5e3 100644 --- a/0.8/webhook.html +++ b/0.8/webhook.html @@ -4,15 +4,15 @@ Using Webhooks Instead of Polling | Fleet - +
    Version: 0.8

    Using Webhooks Instead of Polling

    By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).

    For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling.

    Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file diff --git a/0.9.html b/0.9.html index e15cd852f..fc1199500 100644 --- a/0.9.html +++ b/0.9.html @@ -4,13 +4,13 @@ Overview | Fleet - +
    -
    Version: 0.9

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    - +
    Version: 0.9

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    + \ No newline at end of file diff --git a/0.9/architecture.html b/0.9/architecture.html index 588a86449..09dce33b8 100644 --- a/0.9/architecture.html +++ b/0.9/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

    The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    - +subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    + \ No newline at end of file diff --git a/0.9/bundle-add.html b/0.9/bundle-add.html index 0efc72d9c..762a22869 100644 --- a/0.9/bundle-add.html +++ b/0.9/bundle-add.html @@ -4,7 +4,7 @@ Create a Bundle Resource | Fleet - + @@ -15,8 +15,8 @@ manually by the user. If you want to deploy resources from a git repository use When creating a Bundle resources need to be explicitly specified in the Bundle Spec. Resources can be compressed with gz. See here an example of how Rancher uses compression in go code.

    If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in GitRepo. -See Mapping to Downstream Clusters.

    The following example creates a nginx Deployment in the local cluster:

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    resources:
    # List of all resources that will be deployed
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml
    targets:
    - clusterName: local

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    Convert a Helm Chart into a Bundle

    You can use the Fleet CLI to convert a Helm chart into a bundle.

    For example, you can download and convert the "external secrets" operator chart like this:

    cat > targets.yaml <<EOF
    targets:
    - clusterSelector: {}
    EOF

    mkdir app
    cat > app/fleet.yaml <<EOF
    defaultNamespace: external-secrets
    helm:
    repo: https://charts.external-secrets.io
    chart: external-secrets
    EOF

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

    kubectl apply -f eso-bundle.yaml

    Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

    The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

    - +See Mapping to Downstream Clusters.

    The following example creates a nginx Deployment in the local cluster:

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    resources:
    # List of all resources that will be deployed
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml
    targets:
    - clusterName: local

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    Convert a Helm Chart into a Bundle

    You can use the Fleet CLI to convert a Helm chart into a bundle.

    For example, you can download and convert the "external secrets" operator chart like this:

    cat > targets.yaml <<EOF
    targets:
    - clusterSelector: {}
    EOF

    mkdir app
    cat > app/fleet.yaml <<EOF
    defaultNamespace: external-secrets
    helm:
    repo: https://charts.external-secrets.io
    chart: external-secrets
    EOF

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

    kubectl apply -f eso-bundle.yaml

    Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

    The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

    + \ No newline at end of file diff --git a/0.9/bundle-diffs.html b/0.9/bundle-diffs.html index c3b980a8c..81f436771 100644 --- a/0.9/bundle-diffs.html +++ b/0.9/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs to Ignore Modified GitRepos | Fleet - +
    Version: 0.9

    Generating Diffs to Ignore Modified GitRepos

    Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

    You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

    The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

    This leads the status of the bundle and associated GitRepo to be reported as "Modified"

    Associated Bundle -

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

    https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    - +

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

    https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    + \ No newline at end of file diff --git a/0.9/changelogs.html b/0.9/changelogs.html index 51bf3fcfa..03d96e897 100644 --- a/0.9/changelogs.html +++ b/0.9/changelogs.html @@ -4,13 +4,13 @@ 0.9 Changelogs | Fleet - +
    -
    - +
    + \ No newline at end of file diff --git a/0.9/changelogs/changelogs/v0.9.0.html b/0.9/changelogs/changelogs/v0.9.0.html index d77a8d1a1..c59c4f45a 100644 --- a/0.9/changelogs/changelogs/v0.9.0.html +++ b/0.9/changelogs/changelogs/v0.9.0.html @@ -4,13 +4,13 @@ v0.9.0 | Fleet - +
    -
    Version: 0.9

    v0.9.0

    • (rancherio-gh-m) released this 2023-11-07 12:30:45 +0000 UTC*

    Description

    Notes

    Fleet 0.9 contains major changes to Gitjob. The existing git handling code has been unified and now uses the go-git library. The tekton CLI, which was used for cloning, has been removed. The release improves the performance on downstream clusters, by using a caching client with the helm SDK.

    Known Issues

    • Gitjob might report "git binary not found" if the path within the repository does not exist. rancher/rancher#43499

    Additions

    • Add helm version to capabilities by @manno in #1743
    • Add support for spec field identifying KUBECONFIG namespace for imported clusters by @aiyengar2 in #1786
    • Allow configuring EnableDNS property in Helm through fleet.yaml by @aruiz14 in #1755
    • Allow skipping Helm's schema validation through fleet.yaml by @aruiz14 in #1769
    • Document public API by @manno in #1639
    • Add descriptions to CRDs by @aruiz14 in #1798
    • Helm Storage Backend With Caching by @raulcabello in #1809
    • Include nonResourceURLs Fleet-Agent's RBAC by @manno in #1806

    Bugfixes

    • Add SecurityContext to job container by @raulcabello in #1878
    • Incorrect agent's DebugLevel when settings propagation is set by @aruiz14 in #1776
    • Initialise cluster registration labels map if empty by @weyfonk in #1832
    • Pin version of k8s.io/dynamic-resource-allocation by @aruiz14 in #1754

    What's Changed

    • Add dev scripts to simplify using E2E tests by @p-se in #1764
    • Add integration test to verify fleet.yaml helm options for non-helm type bundles by @thardeck in #1775
    • CI: Retry on context deadline exceeded by @p-se in #1788
    • Document APIServerURL in the config by @manno in #1795
    • E2E: Fix flaky single cluster tests by @p-se in #1784
    • E2E: Increase testenv reliability by @p-se in #1704
    • Fix nightly image build workflow YAML by @manno in #1758
    • Fix patch_crd_descriptions.sh when yq is not installed by @raulcabello in #1810
    • Fixes for running multi cluster E2E tests locally by @p-se in #1762
    • Fix CA variable usage in dev/setup-fleet by @manno in #1766
    • Improve release scripts by @thardeck in #1761
    • Increase speed of clusterregistration clean up hook by @manno in #1712
    • Remove previous version selection in release against rancher script by @thardeck in #1773
    • Remove Tekton references from release docs by @weyfonk in #1833
    • Remove tekton by @raulcabello in #1782
    • Retry k3d image import in workflows by @manno in #1793
    • Simplify Golang version management by @olblak in #1714
    • Switch k3d import to default mode to detect error in e2e setup by @manno in #1797
    • Testenv infra uses local fleet module by @manno in #1756
    • Update README.md with instructions on how to use nektos/act by @p-se in #1765
    • Upgrade k3d k8s versions in CI by @manno in #1780
    • Use constants for agent cluster role names by @manno in #1814
    • Go K8s related security bumps by @thardeck in #1709
    • Bump Golang to 1.21.0 by @rancherbot in #1716
    • Bump all modules by @manno in #1745
    • Bump bci/bci-base from 15.5.36.5.33 to 15.5.36.5.34 in /package by @dependabot in #1805
    • Bump github.com/evanphx/json-patch from 5.6.0+incompatible to 5.7.0+incompatible by @dependabot in #1802

    Full Changelog: v0.8.0...v0.9.0

    Download

    Information retrieved from here

    - +
    Version: 0.9

    v0.9.0

    • (rancherio-gh-m) released this 2023-11-07 12:30:45 +0000 UTC*

    Description

    Notes

    Fleet 0.9 contains major changes to Gitjob. The existing git handling code has been unified and now uses the go-git library. The tekton CLI, which was used for cloning, has been removed. The release improves the performance on downstream clusters, by using a caching client with the helm SDK.

    Known Issues

    • Gitjob might report "git binary not found" if the path within the repository does not exist. rancher/rancher#43499

    Additions

    • Add helm version to capabilities by @manno in #1743
    • Add support for spec field identifying KUBECONFIG namespace for imported clusters by @aiyengar2 in #1786
    • Allow configuring EnableDNS property in Helm through fleet.yaml by @aruiz14 in #1755
    • Allow skipping Helm's schema validation through fleet.yaml by @aruiz14 in #1769
    • Document public API by @manno in #1639
    • Add descriptions to CRDs by @aruiz14 in #1798
    • Helm Storage Backend With Caching by @raulcabello in #1809
    • Include nonResourceURLs Fleet-Agent's RBAC by @manno in #1806

    Bugfixes

    • Add SecurityContext to job container by @raulcabello in #1878
    • Incorrect agent's DebugLevel when settings propagation is set by @aruiz14 in #1776
    • Initialise cluster registration labels map if empty by @weyfonk in #1832
    • Pin version of k8s.io/dynamic-resource-allocation by @aruiz14 in #1754

    What's Changed

    • Add dev scripts to simplify using E2E tests by @p-se in #1764
    • Add integration test to verify fleet.yaml helm options for non-helm type bundles by @thardeck in #1775
    • CI: Retry on context deadline exceeded by @p-se in #1788
    • Document APIServerURL in the config by @manno in #1795
    • E2E: Fix flaky single cluster tests by @p-se in #1784
    • E2E: Increase testenv reliability by @p-se in #1704
    • Fix nightly image build workflow YAML by @manno in #1758
    • Fix patch_crd_descriptions.sh when yq is not installed by @raulcabello in #1810
    • Fixes for running multi cluster E2E tests locally by @p-se in #1762
    • Fix CA variable usage in dev/setup-fleet by @manno in #1766
    • Improve release scripts by @thardeck in #1761
    • Increase speed of clusterregistration clean up hook by @manno in #1712
    • Remove previous version selection in release against rancher script by @thardeck in #1773
    • Remove Tekton references from release docs by @weyfonk in #1833
    • Remove tekton by @raulcabello in #1782
    • Retry k3d image import in workflows by @manno in #1793
    • Simplify Golang version management by @olblak in #1714
    • Switch k3d import to default mode to detect error in e2e setup by @manno in #1797
    • Testenv infra uses local fleet module by @manno in #1756
    • Update README.md with instructions on how to use nektos/act by @p-se in #1765
    • Upgrade k3d k8s versions in CI by @manno in #1780
    • Use constants for agent cluster role names by @manno in #1814
    • Go K8s related security bumps by @thardeck in #1709
    • Bump Golang to 1.21.0 by @rancherbot in #1716
    • Bump all modules by @manno in #1745
    • Bump bci/bci-base from 15.5.36.5.33 to 15.5.36.5.34 in /package by @dependabot in #1805
    • Bump github.com/evanphx/json-patch from 5.6.0+incompatible to 5.7.0+incompatible by @dependabot in #1802

    Full Changelog: v0.8.0...v0.9.0

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.9/changelogs/changelogs/v0.9.1.html b/0.9/changelogs/changelogs/v0.9.1.html index ee3f6419d..cb0d299dc 100644 --- a/0.9/changelogs/changelogs/v0.9.1.html +++ b/0.9/changelogs/changelogs/v0.9.1.html @@ -4,13 +4,13 @@ v0.9.1 | Fleet - +
    -
    Version: 0.9

    v0.9.1

    • (rancherio-gh-m) released this 2024-03-21 16:35:26 +0000 UTC*

    Description

    Notes

    Additions

    Performance

    • Use index when listing BundleDeployments by Bundle by @aruiz14 in #1954
    • Replace json-based implementation of DeepCopy on GenericMap by @aruiz14 in #1955
    • Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by @aruiz14 in #2061
    • Reduce BundleDeployment triggering on deployed resources updates by @aruiz14 in #2031

    Bugfixes

    What's Changed

    Full Changelog: v0.9.0...v0.9.1

    Download

    Information retrieved from here

    - +
    Version: 0.9

    v0.9.1

    • (rancherio-gh-m) released this 2024-03-21 16:35:26 +0000 UTC*

    Description

    Notes

    Additions

    Performance

    • Use index when listing BundleDeployments by Bundle by @aruiz14 in #1954
    • Replace json-based implementation of DeepCopy on GenericMap by @aruiz14 in #1955
    • Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by @aruiz14 in #2061
    • Reduce BundleDeployment triggering on deployed resources updates by @aruiz14 in #2031

    Bugfixes

    What's Changed

    Full Changelog: v0.9.0...v0.9.1

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.9/changelogs/changelogs/v0.9.2.html b/0.9/changelogs/changelogs/v0.9.2.html index 5b0ae59de..27cb78f68 100644 --- a/0.9/changelogs/changelogs/v0.9.2.html +++ b/0.9/changelogs/changelogs/v0.9.2.html @@ -4,13 +4,13 @@ v0.9.2 | Fleet - +
    -
    - +
    + \ No newline at end of file diff --git a/0.9/changelogs/changelogs/v0.9.3.html b/0.9/changelogs/changelogs/v0.9.3.html index f8aab15a6..1265cf689 100644 --- a/0.9/changelogs/changelogs/v0.9.3.html +++ b/0.9/changelogs/changelogs/v0.9.3.html @@ -4,13 +4,13 @@ v0.9.3 | Fleet - +
    -
    Version: 0.9

    v0.9.3

    • (rancherio-gh-m) released this 2024-04-17 09:34:37 +0000 UTC*

    Description

    Bugfixes

    • Prevent creating Content objects if Bundle does not match any target by @aruiz14 in #2215

    What's Changed

    Full Changelog: v0.9.2...v0.9.3

    Download

    Information retrieved from here

    - +
    Version: 0.9

    v0.9.3

    • (rancherio-gh-m) released this 2024-04-17 09:34:37 +0000 UTC*

    Description

    Bugfixes

    • Prevent creating Content objects if Bundle does not match any target by @aruiz14 in #2215

    What's Changed

    Full Changelog: v0.9.2...v0.9.3

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.9/changelogs/changelogs/v0.9.4.html b/0.9/changelogs/changelogs/v0.9.4.html index 1245c2b14..02ecdc2d0 100644 --- a/0.9/changelogs/changelogs/v0.9.4.html +++ b/0.9/changelogs/changelogs/v0.9.4.html @@ -4,13 +4,13 @@ v0.9.4 | Fleet - +
    -
    Version: 0.9

    v0.9.4

    • (rancherio-gh-m) released this 2024-05-02 12:48:10 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.9.3...v0.9.4

    Download

    Information retrieved from here

    - +
    Version: 0.9

    v0.9.4

    • (rancherio-gh-m) released this 2024-05-02 12:48:10 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.9.3...v0.9.4

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.9/changelogs/changelogs/v0.9.5.html b/0.9/changelogs/changelogs/v0.9.5.html index 3660d2e29..c9b6341c5 100644 --- a/0.9/changelogs/changelogs/v0.9.5.html +++ b/0.9/changelogs/changelogs/v0.9.5.html @@ -4,13 +4,13 @@ v0.9.5 | Fleet - +
    -
    Version: 0.9
    - +
    Version: 0.9
    + \ No newline at end of file diff --git a/0.9/changelogs/changelogs/v0.9.6.html b/0.9/changelogs/changelogs/v0.9.6.html index 7a5209898..c65206ef1 100644 --- a/0.9/changelogs/changelogs/v0.9.6.html +++ b/0.9/changelogs/changelogs/v0.9.6.html @@ -4,13 +4,13 @@ v0.9.6 | Fleet - +
    -
    Version: 0.9

    v0.9.6

    • (github-actions[bot]) released this 2024-07-17 16:29:25 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.9.5...v0.9.6

    Download

    Information retrieved from here

    - +
    Version: 0.9

    v0.9.6

    • (github-actions[bot]) released this 2024-07-17 16:29:25 +0000 UTC*

    Description

    What's Changed

    Full Changelog: v0.9.5...v0.9.6

    Download

    Information retrieved from here

    + \ No newline at end of file diff --git a/0.9/cli/fleet-agent.html b/0.9/cli/fleet-agent.html index 36ab57aa2..35e1d335b 100644 --- a/0.9/cli/fleet-agent.html +++ b/0.9/cli/fleet-agent.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.9

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string        An identifier used to scope the agent bundleID names, typically the same as namespace
    --checkin-interval string How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch
    - +
    Version: 0.9

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string        An identifier used to scope the agent bundleID names, typically the same as namespace
    --checkin-interval string How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch
    + \ No newline at end of file diff --git a/0.9/cli/fleet-cli/fleet.html b/0.9/cli/fleet-cli/fleet.html index 47494f169..691df4eb4 100644 --- a/0.9/cli/fleet-cli/fleet.html +++ b/0.9/cli/fleet-cli/fleet.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.9

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet cleanup - Clean up outdated cluster registrations
    • fleet test - Match a bundle to a target and render the output
    - +
    Version: 0.9

    fleet

    fleet [flags]

    Options

          --context string            kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    • fleet apply - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager
    • fleet cleanup - Clean up outdated cluster registrations
    • fleet test - Match a bundle to a target and render the output
    + \ No newline at end of file diff --git a/0.9/cli/fleet-cli/fleet_apply.html b/0.9/cli/fleet-cli/fleet_apply.html index 4745fe594..e8c04daf9 100644 --- a/0.9/cli/fleet-cli/fleet_apply.html +++ b/0.9/cli/fleet-cli/fleet_apply.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.9

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string                     Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --correct-drift Rollback any change made from outside of Fleet
    --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated
    --correct-drift-keep-fail-history Keep helm history for failed rollbacks
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    --helm-credentials-by-path-file string Path of file containing helm credentials for paths
    --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided
    -h, --help help for apply
    --keep-resources Keep resources created after the GitRepo or Bundle is deleted
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Version: 0.9

    fleet apply

    Render a bundle into a Kubernetes resource and apply it in the Fleet Manager

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string                     Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --correct-drift Rollback any change made from outside of Fleet
    --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated
    --correct-drift-keep-fail-history Keep helm history for failed rollbacks
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    --helm-credentials-by-path-file string Path of file containing helm credentials for paths
    --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided
    -h, --help help for apply
    --keep-resources Keep resources created after the GitRepo or Bundle is deleted
    -l, --label strings Labels to apply to created bundles
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.9/cli/fleet-cli/fleet_cleanup.html b/0.9/cli/fleet-cli/fleet_cleanup.html index 6700ed82b..b6250b990 100644 --- a/0.9/cli/fleet-cli/fleet_cleanup.html +++ b/0.9/cli/fleet-cli/fleet_cleanup.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.9

    fleet cleanup

    Clean up outdated cluster registrations

    fleet cleanup [flags]

    Options

          --debug             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --factor string Factor to increase delay between deletes (default: 1.1)
    -h, --help help for cleanup
    --max string Maximum delay between deletes (default: 5s)
    --min string Minimum delay between deletes (default: 10ms)

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Version: 0.9

    fleet cleanup

    Clean up outdated cluster registrations

    fleet cleanup [flags]

    Options

          --debug             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --factor string Factor to increase delay between deletes (default: 1.1)
    -h, --help help for cleanup
    --max string Maximum delay between deletes (default: 5s)
    --min string Minimum delay between deletes (default: 10ms)

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.9/cli/fleet-cli/fleet_test.html b/0.9/cli/fleet-cli/fleet_test.html index a55a7fa55..8a6604835 100644 --- a/0.9/cli/fleet-cli/fleet_test.html +++ b/0.9/cli/fleet-cli/fleet_test.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.9

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    - +
    Version: 0.9

    fleet test

    Match a bundle to a target and render the output

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    Options inherited from parent commands

          --context string            kubeconfig context for authentication
    -k, --kubeconfig string kubeconfig for authentication
    -n, --namespace string namespace (default "fleet-local")
    --system-namespace string System namespace of the controller (default "cattle-fleet-system")

    SEE ALSO

    + \ No newline at end of file diff --git a/0.9/cli/fleet-controller/fleet-manager.html b/0.9/cli/fleet-controller/fleet-manager.html index 657f4c579..758f97bf1 100644 --- a/0.9/cli/fleet-controller/fleet-manager.html +++ b/0.9/cli/fleet-controller/fleet-manager.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: 0.9

    fleet-manager

    fleet-manager [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-bootstrap disable local cluster components
    --disable-gitops disable gitops components
    -h, --help help for fleet-manager
    --kubeconfig string Kubeconfig file
    --namespace string namespace to watch (default "cattle-fleet-system")
    - +
    Version: 0.9

    fleet-manager

    fleet-manager [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-bootstrap disable local cluster components
    --disable-gitops disable gitops components
    -h, --help help for fleet-manager
    --kubeconfig string Kubeconfig file
    --namespace string namespace to watch (default "cattle-fleet-system")
    + \ No newline at end of file diff --git a/0.9/cluster-bundles-state.html b/0.9/cluster-bundles-state.html index 30d58a0f2..3127be84c 100644 --- a/0.9/cluster-bundles-state.html +++ b/0.9/cluster-bundles-state.html @@ -4,13 +4,13 @@ Cluster and Bundle State | Fleet - +
    -
    Version: 0.9

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    - +
    Version: 0.9

    Cluster and Bundle State

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    + \ No newline at end of file diff --git a/0.9/cluster-group.html b/0.9/cluster-group.html index 739ffcc18..08b8ec696 100644 --- a/0.9/cluster-group.html +++ b/0.9/cluster-group.html @@ -4,7 +4,7 @@ Create Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    - +status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    + \ No newline at end of file diff --git a/0.9/cluster-registration.html b/0.9/cluster-registration.html index be09d0be2..65fd74a32 100644 --- a/0.9/cluster-registration.html +++ b/0.9/cluster-registration.html @@ -4,7 +4,7 @@ Register Downstream Clusters | Fleet - + @@ -75,8 +75,8 @@ above example one can run the following one-liner:

    info

    If you are using Fleet standalone without Rancher, it must be installed as described in installation details.

    The manager-initiated registration is used when you add a cluster from the Rancher dashboard.

    Create Kubeconfig Secret

    The format of this secret is intended to match the format of the kubeconfig secret used in cluster-api. -This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    - +This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    + \ No newline at end of file diff --git a/0.9/concepts.html b/0.9/concepts.html index 49cbcd78e..4d5d7f5f8 100644 --- a/0.9/concepts.html +++ b/0.9/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

    • To see the life cycle of a bundle, click here.
  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/0.9/gitrepo-add.html b/0.9/gitrepo-add.html index 1291e12a7..07e18b935 100644 --- a/0.9/gitrepo-add.html +++ b/0.9/gitrepo-add.html @@ -4,7 +4,7 @@ Create a GitRepo Resource | Fleet - + @@ -15,8 +15,8 @@ Make sure you don't leak credentials by mixing public and private repositor or split them into different gitrepos, or use helmRepoURLRegex to limit the scope of credentials to certain servers.

    For a private Helm repo, users can reference a secret with the following keys:

    1. username and password for basic http auth if the Helm HTTP repo is behind basic auth.

    2. cacerts for custom CA bundle if the Helm repo is using a custom CA.

    3. ssh-privatekey for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently.

    For example, to add a secret in kubectl, run

    kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem

    After secret is created, specify the secret to gitRepo.spec.helmSecretName. Make sure secret is created under the same namespace with gitrepo.

    Use different helm credentials for each path

    info

    gitRepo.spec.helmSecretName will be ignored if gitRepo.spec.helmSecretNameForPaths is provided

    Create a file secrets-path.yaml that contains credentials for each path defined in a GitRepo. Credentials will not be used for paths that are not present in this file. The path is the actual path to the bundle (ie to a folder containing a fleet.yaml file) within the git repository, which might have more segments than the entry under paths:.

    Example:

    path-one: # path path-one must exist in the repository
    username: user
    password: pass
    path-two: # path path-one must exist in the repository
    username: user2
    password: pass2
    caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
    sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K

    Create the secret

    kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml

    In the previous example credentials for username user will be used for the path path-one and credentials for username -user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/0.9/gitrepo-content.html b/0.9/gitrepo-content.html index a69b14901..f530ae787 100644 --- a/0.9/gitrepo-content.html +++ b/0.9/gitrepo-content.html @@ -4,7 +4,7 @@ Git Repository Contents | Fleet - + @@ -51,8 +51,8 @@ the contents of a file the convention of adding _patch. (notice the will be replaced with . from the file name and that will be used as the target. For example deployment_patch.yaml will target deployment.yaml. The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch. Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written -using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    - +using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    + \ No newline at end of file diff --git a/0.9/gitrepo-targets.html b/0.9/gitrepo-targets.html index eee3e5cfe..3e1651399 100644 --- a/0.9/gitrepo-targets.html +++ b/0.9/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -23,8 +23,8 @@ and add clusters to it.

    this issue for more details.

  • Helm.WaitForJobs

  • Kustomize.Dir

  • YAML.Overlays

  • Diff.ComparePatches

  • Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/0.9/imagescan.html b/0.9/imagescan.html index 317e68bec..f8c19bd58 100644 --- a/0.9/imagescan.html +++ b/0.9/imagescan.html @@ -4,15 +4,15 @@ Using Image Scan to Update Container Image References | Fleet - +
    Version: 0.9

    Using Image Scan to Update Container Image References

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/0.9/installation.html b/0.9/installation.html index bfb29d2a8..237fc7619 100644 --- a/0.9/installation.html +++ b/0.9/installation.html @@ -4,7 +4,7 @@ Installation Details | Fleet - + @@ -37,8 +37,8 @@ the ca.pem is not correct. The contents of the $API_SERVER_CA and the CA certificate is in the file ca.pem. If your API server URL is signed by a well-known CA you can omit the apiServerCA parameter below or just create an empty ca.pem file (ie touch ca.pem).

    Setup the environment with your specific values, e.g.:

    API_SERVER_URL="https://example.com:6443"
    API_SERVER_CA="ca.pem"

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First add Fleet's Helm repository.
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Second install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd

    Third install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="$API_SERVER_URL" \
    --set-file apiServerCA="$API_SERVER_CA" \
    fleet

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/0.9/multi-user.html b/0.9/multi-user.html index 03dd995e3..7bf1ce2ca 100644 --- a/0.9/multi-user.html +++ b/0.9/multi-user.html @@ -4,7 +4,7 @@ Setup Multi User | Fleet - + @@ -17,8 +17,8 @@ deploy cluster wide resources. Even with the available Fleet restrictions, users are only restricted to namespaces, but namespaces don't provide much isolation on their own. E.g. they can still consume as many resources as they like.

    However, the existing Fleet restrictions allow users to share clusters, and -deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    - +deploy resources without conflicts.

    Example User

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    + \ No newline at end of file diff --git a/0.9/namespaces.html b/0.9/namespaces.html index 5d56e4ca9..00ef99d99 100644 --- a/0.9/namespaces.html +++ b/0.9/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -39,8 +39,8 @@ in an error state and won't be deployed.

    This can also be used to set If an allowedTargetNamespaces restriction is present, all GitRepos must specify a targetNamespace and the specified namespace must be in the allow list. -This also prevents the creation of cluster wide resources.

    - +This also prevents the creation of cluster wide resources.

    + \ No newline at end of file diff --git a/0.9/quickstart.html b/0.9/quickstart.html index 554d8981a..4db26e738 100644 --- a/0.9/quickstart.html +++ b/0.9/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Version: 0.9

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is fairly straightforward. To install the Helm 3 CLI follow the official install instructions.

    Fleet in Rancher

    Rancher has separate helm charts for Fleet and uses a different repository.

    brew install helm
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
    helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet

    Add a Git Repo to Watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/0.9/ref-bundle-stages.html b/0.9/ref-bundle-stages.html index ae67fcc26..67e0b2e07 100644 --- a/0.9/ref-bundle-stages.html +++ b/0.9/ref-bundle-stages.html @@ -4,13 +4,13 @@ Bundle Lifecycle | Fleet - +
    -
    Version: 0.9

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    - +
    Version: 0.9

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    + \ No newline at end of file diff --git a/0.9/ref-bundle.html b/0.9/ref-bundle.html index 35c8d8666..65276ac42 100644 --- a/0.9/ref-bundle.html +++ b/0.9/ref-bundle.html @@ -4,14 +4,14 @@ Bundle Resource | Fleet - +
    Version: 0.9

    Bundle Resource

    Bundles are automatically created by Fleet when a GitRepo is created.

    The content of the resource corresponds to the BundleSpec. -For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    - +For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    + \ No newline at end of file diff --git a/0.9/ref-configuration.html b/0.9/ref-configuration.html index e4c43b8d0..50849eebc 100644 --- a/0.9/ref-configuration.html +++ b/0.9/ref-configuration.html @@ -4,7 +4,7 @@ Configuration | Fleet - + @@ -12,8 +12,8 @@
    Version: 0.9

    Configuration

    A reference list of, mostly internal, configuration options.

    Helm Charts

    The Helm charts accept, at least, the options as shown with their default in values.yaml:

    Environment Variables

    The controllers can be started with these environment variables:

    • CATTLE_DEV_MODE - used to debug wrangler, not usable
    • FLEET_CLUSTER_ENQUEUE_DELAY - tune how often non-ready clusters are checked
    • FLEET_CPU_PPROF_PERIOD - used to turn on performance profiling

    Configuration

    In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments.

    The config struct is used in both config maps:

    • cattle-fleet-system/fleet-agent
    • cattle-fleet-system/fleet-controller

    Labels

    Labels used by fleet:

    • fleet.cattle.io/agent=true - NodeSelector label for agent's deployment affinity setting
    • fleet.cattle.io/non-managed-agent - managed agent bundle won't target Clusters with this label
    • fleet.cattle.io/repo-name - used on Bundle to reference the git repo resource
    • fleet.cattle.io/bundle-namespace - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/bundle-name - used on BundleDeployment to reference the Bundle resource
    • fleet.cattle.io/managed=true - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces.
    • fleet.cattle.io/bootstrap-token - unused

    Annotations

    Annotations used by fleet:

    • fleet.cattle.io/agent-namespace
    • fleet.cattle.io/bundle-id
    • fleet.cattle.io/cluster, fleet.cattle.io/cluster-namespace - used on a cluster namespace to reference the cluster registration namespace and cluster name
    • fleet.cattle.io/cluster-group
    • fleet.cattle.io/cluster-registration-namespace
    • fleet.cattle.io/cluster-registration
    • fleet.cattle.io/commit
    • fleet.cattle.io/managed - appears unused
    • fleet.cattle.io/service-account

    Fleet agent configuration

    Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a Cluster, see Registering Downstream Cluster for more info on how to create Clusters. Default configuration will be used if these fields are not provided.

    If you change the resources limits, make sure the limits allow the fleet-agent to work normally.

    Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults. -Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    - +Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    + \ No newline at end of file diff --git a/0.9/ref-crds.html b/0.9/ref-crds.html index de2109977..37f9119f8 100644 --- a/0.9/ref-crds.html +++ b/0.9/ref-crds.html @@ -4,13 +4,13 @@ Custom Resources Spec | Fleet - +
    -
    Version: 0.9

    Custom Resources Spec

    Sub Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.

    When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse
    deleteCRDResourcesDeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources.boolfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse
    disableDNSDisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to true by default.boolfalse
    skipSchemaValidationSkipSchemaValidation allows skipping schema validation against the chart valuesboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue
    nonReadyNodesNonReadyNodes is the number of nodes that are not ready.inttrue
    readyNodesReadyNodes is the number of nodes that are ready.inttrue
    nonReadyNodeNamesNonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names.[]stringtrue
    readyNodeNamesReadyNodes contains the names of ready nodes. The list is limited to at most 3 names.[]stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    readyNodesReadyNodes is a string in the form \"%d/%d\", that describes the number of nodes that are ready vs. the number of expected nodes.stringfalse
    sampleNodeSampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap.stringfalse
    kubeConfigSecretNamespaceKubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]corev1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]corev1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*corev1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*corev1.ResourceRequirementsfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    agentTLSModeAgentTLSMode supports two values: system-store and strict. If set to system-store, instructs the agent to trust CA bundles from the operating system's store. If set to strict, then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    commitCommit is the Git commit hash from the last gitjob run.stringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last GitJob run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    FleetYAML

    FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle.

    FieldDescriptionSchemeRequired
    nameName of the bundle which will be created.stringfalse
    labelsLabels are copied to the bundle and can be used in a dependsOn.selector.map[string]stringfalse
    BundleSpecBundleSpecfalse
    targetCustomizationsTargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster.[]BundleTargetfalse
    imageScansImageScans are optional and used to update container image references in the git repo.[]ImageScanYAMLfalse
    overrideTargetsOverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo.[]GitTargetfalse

    Back to Custom Resources

    ImageScanYAML

    ImageScanYAML is a single entry in the ImageScan list from fleet.yaml.

    FieldDescriptionSchemeRequired
    nameName of the image scan. Unused.stringfalse
    ImageScanSpecImageScanSpecfalse

    Back to Custom Resources

    - +
    Version: 0.9

    Custom Resources Spec

    Sub Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.

    When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.*map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.*map[string]stringfalse
    deleteCRDResourcesDeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources.boolfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releasestringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse
    disableDNSDisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to true by default.boolfalse
    skipSchemaValidationSkipSchemaValidation allows skipping schema validation against the chart valuesboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue
    nonReadyNodesNonReadyNodes is the number of nodes that are not ready.inttrue
    readyNodesReadyNodes is the number of nodes that are ready.inttrue
    nonReadyNodeNamesNonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names.[]stringtrue
    readyNodeNamesReadyNodes contains the names of ready nodes. The list is limited to at most 3 names.[]stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    readyNodesReadyNodes is a string in the form \"%d/%d\", that describes the number of nodes that are ready vs. the number of expected nodes.stringfalse
    sampleNodeSampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap.stringfalse
    kubeConfigSecretNamespaceKubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]corev1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]corev1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*corev1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*corev1.ResourceRequirementsfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    agentTLSModeAgentTLSMode supports two values: system-store and strict. If set to system-store, instructs the agent to trust CA bundles from the operating system's store. If set to strict, then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    commitCommit is the Git commit hash from the last gitjob run.stringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last GitJob run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    FleetYAML

    FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle.

    FieldDescriptionSchemeRequired
    nameName of the bundle which will be created.stringfalse
    labelsLabels are copied to the bundle and can be used in a dependsOn.selector.map[string]stringfalse
    BundleSpecBundleSpecfalse
    targetCustomizationsTargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster.[]BundleTargetfalse
    imageScansImageScans are optional and used to update container image references in the git repo.[]ImageScanYAMLfalse
    overrideTargetsOverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo.[]GitTargetfalse

    Back to Custom Resources

    ImageScanYAML

    ImageScanYAML is a single entry in the ImageScan list from fleet.yaml.

    FieldDescriptionSchemeRequired
    nameName of the image scan. Unused.stringfalse
    ImageScanSpecImageScanSpecfalse

    Back to Custom Resources

    + \ No newline at end of file diff --git a/0.9/ref-fleet-yaml.html b/0.9/ref-fleet-yaml.html index 4cf1feba5..f93d24e10 100644 --- a/0.9/ref-fleet-yaml.html +++ b/0.9/ref-fleet-yaml.html @@ -4,13 +4,13 @@ fleet.yaml | Fleet - +
    -
    Version: 0.9

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to the struct at pkg/bundlereader/read.go, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # namespaceLabels are labels that will be appended to the namespace created by Fleet.
    namespaceLabels:
    key: value
    # namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.
    namespaceAnnotations:
    key: value

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    ### These options control how "fleet apply" downloads the chart
    #
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0

    ### These options only work for helm-type bundles
    #
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. Note, if the functions output changes with every
    # call, e.g. `uuidv4`, the bundle will get redeployed.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml

    ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.
    #
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # Disable DNS resolution in Helm's template functions
    disableDNS: false
    # Skip evaluation of the values.schema.json file
    skipSchemaValidation: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name. When using Fleet in
    # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1
    # Resources will not be deployed in the matched clusters if doNotDeploy is true.
    doNotDeploy: false

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:
    # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey

    # Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources
    # makes the Bundle to be in an error state when it shouldn't.
    ignore:
    # Conditions to be ignored
    conditions:
    # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}
    - type: Active
    status: "False"

    # Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.
    overrideTargets:
    - clusterSelector:
    matchLabels:
    env: dev

    - +
    Version: 0.9

    fleet.yaml

    The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.

    For more information on how to use the fleet.yaml to customize bundles see Git Repository Contents.

    The content of the fleet.yaml corresponds to the struct at pkg/bundlereader/read.go, which contains the BundleSpec.

    Reference

    fleet.yaml
    # The default namespace to be applied to resources. This field is not used to
    # enforce or lock down the deployment to a specific namespace, but instead
    # provide the default value of the namespace field if one is not specified
    # in the manifests.
    # Default: default
    defaultNamespace: default

    # All resources will be assigned to this namespace and if any cluster scoped
    # resource exists the deployment will fail.
    # Default: ""
    namespace: default

    # namespaceLabels are labels that will be appended to the namespace created by Fleet.
    namespaceLabels:
    key: value
    # namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.
    namespaceAnnotations:
    key: value

    # Optional map of labels, that are set at the bundle and can be used in a
    # dependsOn.selector
    labels:
    key: value

    kustomize:
    # Use a custom folder for kustomize resources. This folder must contain
    # a kustomization.yaml file.
    dir: ./kustomize

    helm:
    ### These options control how "fleet apply" downloads the chart
    #
    # Use a custom location for the Helm chart. This can refer to any go-getter URL or
    # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".
    # This allows one to download charts from most any location. Also know that
    # go-getter URL supports adding a digest to validate the download. If repo
    # is set below this field is the name of the chart to lookup
    chart: ./chart
    # A https URL to a Helm repo to download the chart from. It's typically easier
    # to just use `chart` field and refer to a tgz file. If repo is used the
    # value of `chart` will be used as the chart name to lookup in the Helm repository.
    repo: https://charts.rancher.io
    # The version of the chart or semver constraint of the chart to find. If a constraint
    # is specified it is evaluated each time git changes.
    # The version also determines which chart to download from OCI registries.
    version: 0.1.0

    ### These options only work for helm-type bundles
    #
    # Any values that should be placed in the `values.yaml` and passed to helm during
    # install.
    values:
    any-custom: value
    # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME
    # These can now be accessed directly as variables
    # The variable's value will be an empty string if the referenced cluster label does not
    # exist on the targeted cluster
    variableName: global.fleet.clusterLabels.LABELNAME
    # It is possible to specify the keys and values as go template strings for
    # advanced templating needs. Most of the functions from the sprig templating
    # library are available. Note, if the functions output changes with every
    # call, e.g. `uuidv4`, the bundle will get redeployed.
    # The template context has following keys.
    # `.ClusterValues` are retrieved from target cluster's `spec.templateValues`
    # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.
    # `.ClusterName` as the fleet's cluster resource name.
    # `.ClusterNamespace` as the namespace in which the cluster resource exists.
    # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,
    # unlike helm which uses {{ }}.
    templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"
    valueFromEnv:
    "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }
    # Path to any values files that need to be passed to helm during install
    valuesFiles:
    - values1.yaml
    - values2.yaml
    # Allow to use values files from configmaps or secrets defined in the downstream clusters
    valuesFrom:
    - configMapKeyRef:
    name: configmap-values
    # default to namespace of bundle
    namespace: default
    key: values.yaml
    - secretKeyRef:
    name: secret-values
    namespace: default
    key: values.yaml

    ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.
    #
    # A custom release name to deploy the chart as. If not specified a release name
    # will be generated by combining the invoking GitRepo.name + GitRepo.path.
    releaseName: my-release
    # Makes helm skip the check for its own annotations
    takeOwnership: false
    # Override immutable resources. This could be dangerous.
    force: false
    # Set the Helm --atomic flag when upgrading
    atomic: false
    # Disable go template pre-processing on the fleet values
    disablePreProcess: false
    # Disable DNS resolution in Helm's template functions
    disableDNS: false
    # Skip evaluation of the values.schema.json file
    skipSchemaValidation: false
    # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.
    # It will wait for as long as timeoutSeconds
    waitForJobs: true

    # A paused bundle will not update downstream clusters but instead mark the bundle
    # as OutOfSync. One can then manually confirm that a bundle should be deployed to
    # the downstream clusters.
    # Default: false
    paused: false

    rolloutStrategy:
    # A number or percentage of clusters that can be unavailable during an update
    # of a bundle. This follows the same basic approach as a deployment rollout
    # strategy. Once the number of clusters meets unavailable state update will be
    # paused. Default value is 100% which doesn't take effect on update.
    # default: 100%
    maxUnavailable: 15%
    # A number or percentage of cluster partitions that can be unavailable during
    # an update of a bundle.
    # default: 0
    maxUnavailablePartitions: 20%
    # A number of percentage of how to automatically partition clusters if not
    # specific partitioning strategy is configured.
    # default: 25%
    autoPartitionSize: 10%
    # A list of definitions of partitions. If any target clusters do not match
    # the configuration they are added to partitions at the end following the
    # autoPartitionSize.
    partitions:
    # A user friend name given to the partition used for Display (optional).
    # default: ""
    - name: canary
    # A number or percentage of clusters that can be unavailable in this
    # partition before this partition is treated as done.
    # default: 10%
    maxUnavailable: 10%
    # Selector matching cluster labels to include in this partition
    clusterSelector:
    matchLabels:
    env: prod
    # A cluster group name to include in this partition
    clusterGroup: agroup
    # Selector matching cluster group labels to include in this partition
    clusterGroupSelector:
    clusterSelector:
    matchLabels:
    env: prod

    # Target customization are used to determine how resources should be modified per target
    # Targets are evaluated in order and the first one to match a cluster is used for that cluster.
    targetCustomizations:
    # The name of target. If not specified a default name of the format "target000"
    # will be used. This value is mostly for display
    - name: prod
    # Custom namespace value overriding the value at the root
    namespace: newvalue
    # Custom defaultNamespace value overriding the value at the root
    defaultNamespace: newdefaultvalue
    # Custom kustomize options overriding the options at the root
    kustomize: {}
    # Custom Helm options override the options at the root
    helm: {}
    # If using raw YAML these are names that map to overlays/{name} that will be used
    # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml
    # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.
    # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.
    # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin
    # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.
    yaml:
    overlays:
    - custom2
    - custom3
    # A selector used to match clusters. The structure is the standard
    # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,
    # clusterSelector will be used only to further refine the selection after
    # clusterGroupSelector and clusterGroup is evaluated.
    clusterSelector:
    matchLabels:
    env: prod
    # A selector used to match a specific cluster by name. When using Fleet in
    # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.
    clusterName: dev-cluster
    # A selector used to match cluster groups.
    clusterGroupSelector:
    matchLabels:
    region: us-east
    # A specific clusterGroup by name that will be selected
    clusterGroup: group1
    # Resources will not be deployed in the matched clusters if doNotDeploy is true.
    doNotDeploy: false

    # dependsOn allows you to configure dependencies to other bundles. The current bundle
    # will only be deployed, after all dependencies are deployed and in a Ready state.
    dependsOn:
    # Format: <GITREPO-NAME>-<BUNDLE_PATH> with all path separators replaced by "-"
    # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"
    # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:
    # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7
    - name: one-multi-cluster-hello-world
    # Select bundles to depend on based on their label.
    - selector:
    matchLabels:
    app: weak-monkey

    # Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources
    # makes the Bundle to be in an error state when it shouldn't.
    ignore:
    # Conditions to be ignored
    conditions:
    # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}
    - type: Active
    status: "False"

    # Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.
    overrideTargets:
    - clusterSelector:
    matchLabels:
    env: dev

    + \ No newline at end of file diff --git a/0.9/ref-gitrepo.html b/0.9/ref-gitrepo.html index 0d46bed92..77484d902 100644 --- a/0.9/ref-gitrepo.html +++ b/0.9/ref-gitrepo.html @@ -4,14 +4,14 @@ GitRepo Resource | Fleet - +
    Version: 0.9

    GitRepo Resource

    The GitRepo resource describes git repositories, how to access them and where the bundles are located.

    The content of the resource corresponds to the GitRepoSpec. -For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...
    #
    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    - +For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private registry you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key
    #
    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret
    #
    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*
    #
    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle
    #
    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true
    #
    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...
    #
    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    + \ No newline at end of file diff --git a/0.9/ref-registration.html b/0.9/ref-registration.html index b0b2236f4..903830bc5 100644 --- a/0.9/ref-registration.html +++ b/0.9/ref-registration.html @@ -4,7 +4,7 @@ Cluster Registration Internals | Fleet - + @@ -14,8 +14,8 @@ The import.go will enqueue itself until the import service account exists, because that’s needed to create the fleet-agent-bootstrap secret. Now, the fleet-agent and the bootstrap secret are present on the downstream cluster

    Fleet-Agent -> ClusterRegistration

    Immediately the fleet-agent checks for a fleet-agent-bootstrap secret (which contains the import kubeconfig) and starts registering if present. Then fleet-agent creates a clusterregistration resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret’s name.

    fleet-controller triggers and tries to grant the clusterregistration request to create fleet-agent’s serviceaccount and create the ‘c-*’ registration secret with the clients new kubeconfig. The registration secret name is hash("clientID-clientRandom"). The new kubeconfig uses the "request" account. The request account can access the cluster status, bundledeployments and contents.

    Notes

    • The registration starts with the "import" account and pivots to the "request" account.
    • The fleet-default namespace has all the cluster registrations, the import account uses a separate namespace.
    • Once the agent is registered, fleet-controller will trigger on a cluster/namespace change and call manageagent to create a bundle. The agent will update itself to the bundle and since the generation env var changes it will restart.
    • If no bootstrap secret exists, the agent will not re-register.

    Diagram

    Process

    Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster. -It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    Secrets

    This diagram shows the resources created during registration and focuses on the k8s API server configuration.

    Registration Secrets

    - +It's important to note that there are multiple ways to start this:

    • Creating a bootstrap config. Fleet does this for the local agent.
    • Creating a Cluster resource with a kubeconfig. Rancher does this for downstream clusters. See manager-initiated registration.
    • Create a ClusterRegistrationToken resource, optionally create a Cluster resource for a pre-defined (clientID) cluster. See agent-initiated registration.

    Registration

    Secrets

    This diagram shows the resources created during registration and focuses on the k8s API server configuration.

    Registration Secrets

    + \ No newline at end of file diff --git a/0.9/ref-resources.html b/0.9/ref-resources.html index 635d59118..c14ae616b 100644 --- a/0.9/ref-resources.html +++ b/0.9/ref-resources.html @@ -4,13 +4,13 @@ List of Deployed Resources | Fleet - +
    -
    Version: 0.9

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    - +
    Version: 0.9

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    + \ No newline at end of file diff --git a/0.9/resources-during-deployment.html b/0.9/resources-during-deployment.html index 400dfbe19..a384b6785 100644 --- a/0.9/resources-during-deployment.html +++ b/0.9/resources-during-deployment.html @@ -4,13 +4,13 @@ Custom Resources During Deployment | Fleet - + - +
    + \ No newline at end of file diff --git a/0.9/troubleshooting.html b/0.9/troubleshooting.html index 7507624fd..b88605b9e 100644 --- a/0.9/troubleshooting.html +++ b/0.9/troubleshooting.html @@ -4,7 +4,7 @@ Troubleshooting | Fleet - + @@ -12,8 +12,8 @@
    Version: 0.9

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Fetch detailed status from GitRepos and Bundles?

    For debugging and bug reports the raw JSON of the resources status fields is most useful. This can be accessed in the Rancher UI, or through kubectl:

    kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}
    kubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority"

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name>
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Agent is no longer registered

    You can force a redeployment of an agent for a given cluster by setting redeployAgentGeneration.

    kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p '[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]'

    Nested GitRepo CRs

    Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available.

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    + \ No newline at end of file diff --git a/0.9/tut-deployment.html b/0.9/tut-deployment.html index 976fe06b7..9733305eb 100644 --- a/0.9/tut-deployment.html +++ b/0.9/tut-deployment.html @@ -4,7 +4,7 @@ Creating a Deployment | Fleet - + @@ -13,8 +13,8 @@ For more details on the options that are available per Git repository see Adding a GitRepo.

    Single-Cluster Examples

    All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet.

    An example using Helm. We are deploying the helm example to the local cluster.

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment:

    fleet.yaml
    namespace: fleet-helm-example

    # Custom helm options
    helm:
    # The release name to use. If empty a generated release name will be used
    releaseName: guestbook

    # The directory of the chart in the repo. Also any valid go-getter supported
    # URL can be used there is specify where to download the chart from.
    # If repo below is set this value if the chart name in the repo
    chart: ""

    # An https to a valid Helm repository to download the chart from
    repo: ""

    # Used if repo is set to look up the version of the chart
    version: ""

    # Force recreate resource that can not be updated
    force: false

    # How long for helm to wait for the release to be active. If the value
    # is less that or equal to zero, we will not wait in Helm
    timeoutSeconds: 0

    # Custom values that will be passed as values.yaml to the installation
    values:
    replicas: 2

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-local namespace contains the local cluster resource. The local fleet-agent will create the deployment in the fleet-helm-example namespace.

    kubectl apply -n fleet-local -f - <<EOF
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - single-cluster/helm
    EOF

    Multi-Cluster Examples

    The examples below will deploy a multi git repo to multiple clusters at once and configure the app differently for each target.

    An example using Helm. We are deploying the helm example and customizing it per target cluster

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment. The fleet.yaml is used to configure different deployment options, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-helm-example
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/helm
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod

    By applying the gitrepo resource to the upstream cluster, fleet will start to monitor the repository and create deployments:

    kubectl apply -n fleet-default -f gitrepo.yaml
    - +The application will be customized as follows per environment:

    • Dev clusters: Only the redis leader is deployed and not the followers.
    • Test clusters: Scale the front deployment to 3
    • Prod clusters: Scale the front deployment to 3 and set the service type to LoadBalancer

    The fleet.yaml is used to control which 'yaml' overlays are used, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-manifest-example
    targetCustomizations:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev
    yaml:
    overlays:
    # Refers to overlays/noreplication folder
    - noreplication

    - name: test
    clusterSelector:
    matchLabels:
    env: test
    yaml:
    overlays:
    # Refers to overlays/scale3 folder
    - scale3

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    yaml:
    # Refers to overlays/servicelb, scale3 folders
    overlays:
    - servicelb
    - scale3

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: manifests
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/manifests
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    kubectl apply -n fleet-default -f gitrepo.yaml
    + \ No newline at end of file diff --git a/0.9/uninstall.html b/0.9/uninstall.html index e26ae36f8..9cfdc779b 100644 --- a/0.9/uninstall.html +++ b/0.9/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - + - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    caution

    Uninstalling the CRDs will remove all deployed workloads.

    + \ No newline at end of file diff --git a/0.9/webhook.html b/0.9/webhook.html index 2197d38e0..fa604606c 100644 --- a/0.9/webhook.html +++ b/0.9/webhook.html @@ -4,15 +4,15 @@ Using Webhooks Instead of Polling | Fleet - +
    Version: 0.9

    Using Webhooks Instead of Polling

    By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).

    For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling.

    Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file diff --git a/404.html b/404.html index 4e2482646..26fba64df 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Fleet - +

    Page Not Found

    We could not find what you were looking for.

    Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

    - + \ No newline at end of file diff --git a/architecture.html b/architecture.html index 0052be68c..2826bc31a 100644 --- a/architecture.html +++ b/architecture.html @@ -4,7 +4,7 @@ Architecture | Fleet - + @@ -28,8 +28,8 @@ The cluster registration token is used only during the registration process to g to that cluster. After the cluster credential is established the cluster "forgets" the cluster registration token.

    The service accounts given to the clusters only have privileges to list BundleDeployment in the namespace created specifically for that cluster. It can also update the status subresource of BundleDeployment and the status -subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    - +subresource of it's Cluster resource.

    Component Overview

    An overview of the components and how they interact on a high level.

    Components

    + \ No newline at end of file diff --git a/assets/js/01681239.5c78b2fc.js b/assets/js/01681239.7ffdc0ea.js similarity index 63% rename from assets/js/01681239.5c78b2fc.js rename to assets/js/01681239.7ffdc0ea.js index 9c17f2717..ce38a78da 100644 --- a/assets/js/01681239.5c78b2fc.js +++ b/assets/js/01681239.7ffdc0ea.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3165],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>u});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=r.createContext({}),p=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},f=function(e){var t=p(e.components);return r.createElement(i.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),m=p(n),g=l,u=m["".concat(i,".").concat(g)]||m[g]||s[g]||o;return n?r.createElement(u,a(a({ref:t},f),{},{components:n})):r.createElement(u,a({ref:t},f))}));function u(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=g;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[m]="string"==typeof e?e:l,a[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleetcontroller agentmanagement"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller_agentmanagement",id:"cli/fleet-controller/fleetcontroller_agentmanagement",title:"",description:"fleetcontroller agentmanagement",source:"@site/docs/cli/fleet-controller/fleetcontroller_agentmanagement.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_agentmanagement",permalink:"/cli/fleet-controller/fleetcontroller_agentmanagement",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller_agentmanagement.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller agentmanagement"},sidebar:"docs",previous:{title:"fleetcontroller",permalink:"/cli/fleet-controller/fleetcontroller"},next:{title:"fleetcontroller cleanup",permalink:"/cli/fleet-controller/fleetcontroller_cleanup"}},i={},p=[{value:"fleetcontroller agentmanagement",id:"fleetcontroller-agentmanagement",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},m="wrapper";function s(e){let{components:t,...n}=e;return(0,l.yg)(m,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-agentmanagement"},"fleetcontroller agentmanagement"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller agentmanagement [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --disable-bootstrap disable local cluster components\n -h, --help help for agentmanagement\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3165],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>u});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=r.createContext({}),p=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},f=function(e){var t=p(e.components);return r.createElement(i.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),m=p(n),g=l,u=m["".concat(i,".").concat(g)]||m[g]||s[g]||o;return n?r.createElement(u,a(a({ref:t},f),{},{components:n})):r.createElement(u,a({ref:t},f))}));function u(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=g;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[m]="string"==typeof e?e:l,a[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleetcontroller agentmanagement"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller_agentmanagement",id:"cli/fleet-controller/fleetcontroller_agentmanagement",title:"",description:"fleetcontroller agentmanagement",source:"@site/docs/cli/fleet-controller/fleetcontroller_agentmanagement.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_agentmanagement",permalink:"/cli/fleet-controller/fleetcontroller_agentmanagement",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller_agentmanagement.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller agentmanagement"},sidebar:"docs",previous:{title:"fleetcontroller",permalink:"/cli/fleet-controller/fleetcontroller"},next:{title:"fleetcontroller cleanup",permalink:"/cli/fleet-controller/fleetcontroller_cleanup"}},i={},p=[{value:"fleetcontroller agentmanagement",id:"fleetcontroller-agentmanagement",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},m="wrapper";function s(e){let{components:t,...n}=e;return(0,l.yg)(m,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-agentmanagement"},"fleetcontroller agentmanagement"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller agentmanagement [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --disable-bootstrap disable local cluster components\n -h, --help help for agentmanagement\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/01b4035b.377c6de8.js b/assets/js/01b4035b.377c6de8.js deleted file mode 100644 index ee053a323..000000000 --- a/assets/js/01b4035b.377c6de8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9450],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>g});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,g=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(g,r(r({ref:a},c),{},{components:t})):n.createElement(g,r({ref:a},c))}));function g(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={toc_max_heading_level:4},r="Namespaces",i={unversionedId:"namespaces",id:"namespaces",title:"Namespaces",description:"Workload Namespaces",source:"@site/docs/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/namespaces.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{toc_max_heading_level:4},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/resources-during-deployment"}},o={},p=[{value:"Workload Namespaces",id:"workload-namespaces",level:2},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:3},{value:"Configuring Workload Namespaces",id:"configuring-workload-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:3},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:3},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:4},{value:"Fleet Namespaces",id:"fleet-namespaces",level:2},{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:3},{value:"Internal Namespaces",id:"internal-namespaces",level:3},{value:"Cluster Registration Namespace: fleet-local",id:"cluster-registration-namespace-fleet-local",level:4},{value:"System Namespace: cattle-fleet-system",id:"system-namespace-cattle-fleet-system",level:4},{value:"System Registration Namespace: cattle-fleet-clusters-system",id:"system-registration-namespace-cattle-fleet-clusters-system",level:4},{value:"Cluster Namespaces",id:"cluster-namespaces",level:4}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("h2",{id:"workload-namespaces"},"Workload Namespaces"),(0,s.yg)("h3",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be\ncreated if it does not already exist."),(0,s.yg)("h3",{id:"configuring-workload-namespaces"},"Configuring Workload Namespaces"),(0,s.yg)("p",null,"When configuring workload namespaces, it is important to be aware that certain\noptions are designed to override the values of other options or namespace\ndefinitions in workload resources. In some cases, setting namespaces using some\noptions may result in errors if the resources to be deployed contain\nnon-namespaced resources. To get a better understanding of how these options\ninteract, refer to the diagram below. For more details on a specific option,\nplease refer to the ",(0,s.yg)("a",{parentName:"p",href:"/ref-gitrepo"},"GitRepo")," or\n",(0,s.yg)("a",{parentName:"p",href:"/ref-fleet-yaml"},"fleet.yaml")," reference."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Configuring Workload Namespaces",src:t(6580).A,width:"408",height:"1046"})),(0,s.yg)("h3",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The\nprimary purpose of this is so that a central privileged team can manage common\nconfiguration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a\ncluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a\nnamespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," and no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get\nconfusing if you have Clusters in the same repo as the cross namespace\n",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still always be evaluated against the current namespace. So if\nyou have clusters in the same namespace you may wish to make them canary\nclusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles"),"\nlabels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will be evaluated against all clusters\nin all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the\ncreated bundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the\n",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h3",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions. If a\n",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be in an\nerror state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and\n",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h4",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream\ncluster. If an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nmust specify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the\nallow list. This also prevents the creation of cluster wide resources."),(0,s.yg)("h2",{id:"fleet-namespaces"},"Fleet Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of a custom\nresource, e.g. GitRepo, does not influence the namespace of deployed resources."),(0,s.yg)("p",null,"Understanding how namespaces are used in the Fleet manager\nis important to understand the security model and how one can use Fleet in a\nmulti-tenant fashion."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against the ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),"\nand ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give\n",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges to a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end\nuser can modify the selector to match any cluster in that namespace. This means\nin practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nregistrations but they should not be able to target each others clusters, they\nshould be in different namespaces."),(0,s.yg)("p",null,"The cluster registration namespace, called 'workspace' in Rancher, contains the ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," and the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," resources, as well as any ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles"),"."),(0,s.yg)("p",null,"Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and\n",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"fleet-default")," will contain all the downstream clusters that are already\nregistered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"fleet-local")," will contain the local cluster by default. Access to\n",(0,s.yg)("inlineCode",{parentName:"li"},"fleet-local")," is limited.")),(0,s.yg)("admonition",{title:"important information",type:"warning"},(0,s.yg)("p",{parentName:"admonition"},"Deleting the workspace, cluster registration namespace, will delete all the clusters within that namespace.\nThis will uninstall all deployed bundles, except for the fleet agent, from the deleted clusters.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/concepts"},"single cluster")," style, the namespace\nwill always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check\n",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the\n",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/concepts"},"multi-cluster")," style, please ensure you use the correct\nrepo that will map to the right target clusters."),(0,s.yg)("h3",{id:"internal-namespaces"},"Internal Namespaces"),(0,s.yg)("h4",{id:"cluster-registration-namespace-fleet-local"},"Cluster Registration Namespace: fleet-local"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster\nuse case or to bootstrap the configuration of the Fleet manager.\nAccess to the local cluster should be limited to operators."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one\n",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets\nare specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup"),"\nnamed ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the\ncluster the Fleet manager is running on."),(0,s.yg)("h4",{id:"system-namespace-cattle-fleet-system"},"System Namespace: cattle-fleet-system"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts\nreferenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected to live in this namespace in the\ndownstream cluster."),(0,s.yg)("h4",{id:"system-registration-namespace-cattle-fleet-clusters-system"},"System Registration Namespace: cattle-fleet-clusters-system"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should\ncontain no other resources in it, especially secrets."),(0,s.yg)("h4",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager\nfor that cluster. These namespaces are named in the form\n",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this namespace is\nthat all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update\n",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"},6580:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetWorkloadNamespaces-f336f50d9059b8a8e8a5da8da93a7a4b.png"}}]); \ No newline at end of file diff --git a/assets/js/01b4035b.8acc7875.js b/assets/js/01b4035b.8acc7875.js new file mode 100644 index 000000000..ff7239a5e --- /dev/null +++ b/assets/js/01b4035b.8acc7875.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9450],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>g});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,g=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(g,r(r({ref:a},c),{},{components:t})):n.createElement(g,r({ref:a},c))}));function g(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={toc_max_heading_level:4},r="Namespaces",i={unversionedId:"namespaces",id:"namespaces",title:"Namespaces",description:"Workload Namespaces",source:"@site/docs/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/namespaces.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{toc_max_heading_level:4},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/resources-during-deployment"}},o={},p=[{value:"Workload Namespaces",id:"workload-namespaces",level:2},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:3},{value:"Configuring Workload Namespaces",id:"configuring-workload-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:3},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:3},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:4},{value:"Fleet Namespaces",id:"fleet-namespaces",level:2},{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:3},{value:"Internal Namespaces",id:"internal-namespaces",level:3},{value:"Cluster Registration Namespace: fleet-local",id:"cluster-registration-namespace-fleet-local",level:4},{value:"System Namespace: cattle-fleet-system",id:"system-namespace-cattle-fleet-system",level:4},{value:"System Registration Namespace: cattle-fleet-clusters-system",id:"system-registration-namespace-cattle-fleet-clusters-system",level:4},{value:"Cluster Namespaces",id:"cluster-namespaces",level:4}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("h2",{id:"workload-namespaces"},"Workload Namespaces"),(0,s.yg)("h3",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be\ncreated if it does not already exist."),(0,s.yg)("h3",{id:"configuring-workload-namespaces"},"Configuring Workload Namespaces"),(0,s.yg)("p",null,"When configuring workload namespaces, it is important to be aware that certain\noptions are designed to override the values of other options or namespace\ndefinitions in workload resources. In some cases, setting namespaces using some\noptions may result in errors if the resources to be deployed contain\nnon-namespaced resources. To get a better understanding of how these options\ninteract, refer to the diagram below. For more details on a specific option,\nplease refer to the ",(0,s.yg)("a",{parentName:"p",href:"/ref-gitrepo"},"GitRepo")," or\n",(0,s.yg)("a",{parentName:"p",href:"/ref-fleet-yaml"},"fleet.yaml")," reference."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Configuring Workload Namespaces",src:t(6580).A,width:"408",height:"1046"})),(0,s.yg)("h3",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The\nprimary purpose of this is so that a central privileged team can manage common\nconfiguration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a\ncluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a\nnamespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," and no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get\nconfusing if you have Clusters in the same repo as the cross namespace\n",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still always be evaluated against the current namespace. So if\nyou have clusters in the same namespace you may wish to make them canary\nclusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles"),"\nlabels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will be evaluated against all clusters\nin all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the\ncreated bundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the\n",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h3",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions. If a\n",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be in an\nerror state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and\n",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h4",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream\ncluster. If an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nmust specify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the\nallow list. This also prevents the creation of cluster wide resources."),(0,s.yg)("h2",{id:"fleet-namespaces"},"Fleet Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of a custom\nresource, e.g. GitRepo, does not influence the namespace of deployed resources."),(0,s.yg)("p",null,"Understanding how namespaces are used in the Fleet manager\nis important to understand the security model and how one can use Fleet in a\nmulti-tenant fashion."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against the ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),"\nand ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give\n",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges to a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end\nuser can modify the selector to match any cluster in that namespace. This means\nin practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nregistrations but they should not be able to target each others clusters, they\nshould be in different namespaces."),(0,s.yg)("p",null,"The cluster registration namespace, called 'workspace' in Rancher, contains the ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," and the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," resources, as well as any ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles"),"."),(0,s.yg)("p",null,"Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and\n",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"fleet-default")," will contain all the downstream clusters that are already\nregistered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"fleet-local")," will contain the local cluster by default. Access to\n",(0,s.yg)("inlineCode",{parentName:"li"},"fleet-local")," is limited.")),(0,s.yg)("admonition",{title:"important information",type:"warning"},(0,s.yg)("p",{parentName:"admonition"},"Deleting the workspace, cluster registration namespace, will delete all the clusters within that namespace.\nThis will uninstall all deployed bundles, except for the fleet agent, from the deleted clusters.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/concepts"},"single cluster")," style, the namespace\nwill always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check\n",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the\n",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/concepts"},"multi-cluster")," style, please ensure you use the correct\nrepo that will map to the right target clusters."),(0,s.yg)("h3",{id:"internal-namespaces"},"Internal Namespaces"),(0,s.yg)("h4",{id:"cluster-registration-namespace-fleet-local"},"Cluster Registration Namespace: fleet-local"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster\nuse case or to bootstrap the configuration of the Fleet manager.\nAccess to the local cluster should be limited to operators."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one\n",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets\nare specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup"),"\nnamed ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the\ncluster the Fleet manager is running on."),(0,s.yg)("h4",{id:"system-namespace-cattle-fleet-system"},"System Namespace: cattle-fleet-system"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts\nreferenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected to live in this namespace in the\ndownstream cluster."),(0,s.yg)("h4",{id:"system-registration-namespace-cattle-fleet-clusters-system"},"System Registration Namespace: cattle-fleet-clusters-system"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should\ncontain no other resources in it, especially secrets."),(0,s.yg)("h4",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager\nfor that cluster. These namespaces are named in the form\n",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this namespace is\nthat all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update\n",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"},6580:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetWorkloadNamespaces-f336f50d9059b8a8e8a5da8da93a7a4b.png"}}]); \ No newline at end of file diff --git a/assets/js/0209d9e7.3f7fcbcb.js b/assets/js/0209d9e7.3f7fcbcb.js deleted file mode 100644 index 4bd0a64c6..000000000 --- a/assets/js/0209d9e7.3f7fcbcb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[501],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),d=o,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.7/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.7/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.7/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-gitrepo.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.7/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.7/ref-bundle"}},c={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/32a14031.12542692.js b/assets/js/0209d9e7.484e2daa.js similarity index 52% rename from assets/js/32a14031.12542692.js rename to assets/js/0209d9e7.484e2daa.js index b1495e6c9..3def49cd0 100644 --- a/assets/js/32a14031.12542692.js +++ b/assets/js/0209d9e7.484e2daa.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2722],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.8/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.8/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.8/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-gitrepo.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.8/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.8/ref-bundle"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n #\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default. \n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating \n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[501],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),d=o,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.7/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.7/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.7/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-gitrepo.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.7/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.7/ref-bundle"}},c={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0252b8ff.0cdef481.js b/assets/js/0252b8ff.0cdef481.js new file mode 100644 index 000000000..181f24c42 --- /dev/null +++ b/assets/js/0252b8ff.0cdef481.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5174],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(a),m=r,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||l;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Expected Repo Structure",i={unversionedId:"gitrepo-structure",id:"version-0.4/gitrepo-structure",title:"Expected Repo Structure",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.4/gitrepo-structure.md",sourceDirName:".",slug:"/gitrepo-structure",permalink:"/0.4/gitrepo-structure",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/gitrepo-structure.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Adding a GitRepo",permalink:"/0.4/gitrepo-add"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.4/gitrepo-targets"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Reference",id:"reference",level:3},{value:"Private Helm Repositories",id:"private-helm-repositories",level:3},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle state",id:"cluster-and-bundle-state",level:2}],u={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"expected-repo-structure"},"Expected Repo Structure"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.4/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",{parentName:"admonition"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helmValues")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),".")))),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n variableName: global.fleet.clusterLabels.LABELNAME\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default \n key: values.yaml\n secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector: agroup\n \n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. \n clusterName: dev-cluster \n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n')),(0,r.yg)("h3",{id:"private-helm-repositories"},"Private Helm Repositories"),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in downstream clusters."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata: \n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file we be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.4/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0252b8ff.ffa0298b.js b/assets/js/0252b8ff.ffa0298b.js deleted file mode 100644 index c08b9482d..000000000 --- a/assets/js/0252b8ff.ffa0298b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5174],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(a),m=r,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||l;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Expected Repo Structure",i={unversionedId:"gitrepo-structure",id:"version-0.4/gitrepo-structure",title:"Expected Repo Structure",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.4/gitrepo-structure.md",sourceDirName:".",slug:"/gitrepo-structure",permalink:"/0.4/gitrepo-structure",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/gitrepo-structure.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Adding a GitRepo",permalink:"/0.4/gitrepo-add"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.4/gitrepo-targets"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Reference",id:"reference",level:3},{value:"Private Helm Repositories",id:"private-helm-repositories",level:3},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle state",id:"cluster-and-bundle-state",level:2}],u={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"expected-repo-structure"},"Expected Repo Structure"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.4/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",{parentName:"admonition"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helmValues")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),".")))),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n variableName: global.fleet.clusterLabels.LABELNAME\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default \n key: values.yaml\n secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector: agroup\n \n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. \n clusterName: dev-cluster \n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n')),(0,r.yg)("h3",{id:"private-helm-repositories"},"Private Helm Repositories"),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in downstream clusters."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata: \n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file we be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.4/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/02d72f40.274b233c.js b/assets/js/02d72f40.274b233c.js new file mode 100644 index 000000000..5e540a52a --- /dev/null +++ b/assets/js/02d72f40.274b233c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9370],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,o=new Array(s);o[0]=p;var i={};for(var n in t)hasOwnProperty.call(t,n)&&(i[n]=t[n]);i.originalType=e,i[h]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.7.0",date:"2023-06-12 13:24:29 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.7.0",id:"version-0.7/changelogs/changelogs/v0.7.0",title:"v0.7.0",description:"(rancherio-gh-m) released this 2023-06-12 1329 +0000 UTC",source:"@site/versioned_docs/version-0.7/changelogs/changelogs/v0.7.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.7.0",permalink:"/0.7/changelogs/changelogs/v0.7.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/changelogs/changelogs/v0.7.0.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.7.0",date:"2023-06-12 13:24:29 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.7/troubleshooting"},next:{title:"v0.7.1",permalink:"/0.7/changelogs/changelogs/v0.7.1"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-06-12 13:24:29 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"The packaged helm chart ",(0,l.yg)("code",null,"fleet-0.7.0.tgz")," was reuploaded to fix the Gitjob version constraint following ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1759128522","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1593","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1593/hovercard",href:"https://github.com/rancher/fleet/pull/1593"},"#1593")),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add agent config for tolerations, affinity, resources on cluster by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1637728835","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1433","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1433/hovercard",href:"https://github.com/rancher/fleet/pull/1433"},"#1433")),(0,l.yg)("li",null,"Add JSON schema validation for agent customization in cluster CRD by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1683157339","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1490","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1490/hovercard",href:"https://github.com/rancher/fleet/pull/1490"},"#1490")),(0,l.yg)("li",null,"Configure tolerations for fleet-agent from cluster CR by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rajiteh/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rajiteh"},"@rajiteh")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1473805824","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1154","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1154/hovercard",href:"https://github.com/rancher/fleet/pull/1154"},"#1154")),(0,l.yg)("li",null,"Agent registration recovery by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1741381268","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1579","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1579/hovercard",href:"https://github.com/rancher/fleet/pull/1579"},"#1579")),(0,l.yg)("li",null,"Clean up orphaned request service accounts, remove unused managed annotations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1574308682","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1310","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1310/hovercard",href:"https://github.com/rancher/fleet/pull/1310"},"#1310")),(0,l.yg)("li",null,"Add flag to disable local cluster bootstrap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504965604","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1207","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1207/hovercard",href:"https://github.com/rancher/fleet/pull/1207"},"#1207")),(0,l.yg)("li",null,"Fix agent not starting in old fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1579937640","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1316","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1316/hovercard",href:"https://github.com/rancher/fleet/pull/1316"},"#1316")),(0,l.yg)("li",null,"Configure FLEET_CLUSTER_ENQUEUE_DELAY in helm chart by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/johnjcool/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/johnjcool"},"@johnjcool")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1622878430","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1404","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1404/hovercard",href:"https://github.com/rancher/fleet/pull/1404"},"#1404")),(0,l.yg)("li",null,"Do not always create a Bundle for the root path by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1572931152","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1309","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1309/hovercard",href:"https://github.com/rancher/fleet/pull/1309"},"#1309")),(0,l.yg)("li",null,"Always get labels from Bundle when creating a BundleDeployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1634035180","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1428","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1428/hovercard",href:"https://github.com/rancher/fleet/pull/1428"},"#1428")),(0,l.yg)("li",null,"Add helm capabilities to agent's deployer by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1560096890","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1287","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1287/hovercard",href:"https://github.com/rancher/fleet/pull/1287"},"#1287")),(0,l.yg)("li",null,"Add waitForJobs as a helm option by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1587738708","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1330","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1330/hovercard",href:"https://github.com/rancher/fleet/pull/1330"},"#1330")),(0,l.yg)("li",null,"Allow resources to be kept when deleting a GitRepo or a Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1613422358","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1382","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1382/hovercard",href:"https://github.com/rancher/fleet/pull/1382"},"#1382")),(0,l.yg)("li",null,"Improve behavior on failed deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1678637183","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1485","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1485/hovercard",href:"https://github.com/rancher/fleet/pull/1485"},"#1485")),(0,l.yg)("li",null,"Add ignore conditions for the status of deployed custom resources by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1676498420","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1482","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1482/hovercard",href:"https://github.com/rancher/fleet/pull/1482"},"#1482"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Ensure fleet-agent's helm release name has valid length by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1603305549","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1353","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1353/hovercard",href:"https://github.com/rancher/fleet/pull/1353"},"#1353")),(0,l.yg)("li",null,"Ensure ClusterRegistrationToken name is below 63 characters by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1606556526","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1360","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1360/hovercard",href:"https://github.com/rancher/fleet/pull/1360"},"#1360")),(0,l.yg)("li",null,"AllowedRepoPatterns in GitRepoRestriction is matched against Repo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/johnjcool/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/johnjcool"},"@johnjcool")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1611495191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1379","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1379/hovercard",href:"https://github.com/rancher/fleet/pull/1379"},"#1379")),(0,l.yg)("li",null,"Properly set keepResources if releaseName is empty by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1618615310","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1394","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1394/hovercard",href:"https://github.com/rancher/fleet/pull/1394"},"#1394")),(0,l.yg)("li",null,"Retry helm upgrade if it was interrupted by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1631722825","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1424","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1424/hovercard",href:"https://github.com/rancher/fleet/pull/1424"},"#1424")),(0,l.yg)("li",null,"Fix BundleNamespaceMapping ignoring bundle selector by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1631922521","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1425","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1425/hovercard",href:"https://github.com/rancher/fleet/pull/1425"},"#1425")),(0,l.yg)("li",null,"Don't ignore config map reference in valuesFrom list element by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1636072808","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1431","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1431/hovercard",href:"https://github.com/rancher/fleet/pull/1431"},"#1431")),(0,l.yg)("li",null,"Agent should only select Linux nodes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1693766556","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1505","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1505/hovercard",href:"https://github.com/rancher/fleet/pull/1505"},"#1505")),(0,l.yg)("li",null,"Also check chart with the helmRepoURLRegex by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1593772790","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1341","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1341/hovercard",href:"https://github.com/rancher/fleet/pull/1341"},"#1341")),(0,l.yg)("li",null,"Fix cluster targeting and missing customizations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1666045658","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1473","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1473/hovercard",href:"https://github.com/rancher/fleet/pull/1473"},"#1473"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add container security context to fleet-agent helm chart by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/puffitos/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/puffitos"},"@puffitos")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1562171016","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1293","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1293/hovercard",href:"https://github.com/rancher/fleet/pull/1293"},"#1293")),(0,l.yg)("li",null,"Managed fleet-agent uses same securityContext as helm chart by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1579373211","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1314","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1314/hovercard",href:"https://github.com/rancher/fleet/pull/1314"},"#1314")),(0,l.yg)("li",null,"Remove fleet-agent simulators by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504951189","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1206","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1206/hovercard",href:"https://github.com/rancher/fleet/pull/1206"},"#1206")),(0,l.yg)("li",null,"Remove flag to disable leaderElection for simulators by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1632219997","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1426","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1426/hovercard",href:"https://github.com/rancher/fleet/pull/1426"},"#1426")),(0,l.yg)("li",null,"Add Github action to release Fleet against Rancher by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1598491527","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1346","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1346/hovercard",href:"https://github.com/rancher/fleet/pull/1346"},"#1346")),(0,l.yg)("li",null,"Change version number for nightly releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1608705004","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1367","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1367/hovercard",href:"https://github.com/rancher/fleet/pull/1367"},"#1367")),(0,l.yg)("li",null,"Log regex compilation error in git repo restriction with patterns by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1613666739","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1383","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1383/hovercard",href:"https://github.com/rancher/fleet/pull/1383"},"#1383")),(0,l.yg)("li",null,"Split Examples Tests from E2E Tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1619159167","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1397","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1397/hovercard",href:"https://github.com/rancher/fleet/pull/1397"},"#1397")),(0,l.yg)("li",null,"Add nightly e2e workflow to test more k8s versions by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1701958086","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1518","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1518/hovercard",href:"https://github.com/rancher/fleet/pull/1518"},"#1518")),(0,l.yg)("li",null,"Replace deprecated command in Github action with environment file by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/jongwooo/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/jongwooo"},"@jongwooo")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1689964438","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1500","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1500/hovercard",href:"https://github.com/rancher/fleet/pull/1500"},"#1500"))),(0,l.yg)("h2",null,"New Contributors"),(0,l.yg)("ul",null,(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/johnjcool/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/johnjcool"},"@johnjcool")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1611495191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1379","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1379/hovercard",href:"https://github.com/rancher/fleet/pull/1379"},"#1379")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1662723966","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1472","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1472/hovercard",href:"https://github.com/rancher/fleet/pull/1472"},"#1472")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/jongwooo/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/jongwooo"},"@jongwooo")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1689964438","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1500","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1500/hovercard",href:"https://github.com/rancher/fleet/pull/1500"},"#1500"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.6.0...v0.7.0"},(0,l.yg)("tt",null,"v0.6.0...v0.7.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-0.7.0.tgz"},"fleet-0.7.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-crd-0.7.0.tgz"},"fleet-crd-0.7.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-agent-0.7.0.tgz"},"fleet-agent-0.7.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.7.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/02d72f40.92ac8c83.js b/assets/js/02d72f40.92ac8c83.js deleted file mode 100644 index 81a7e8033..000000000 --- a/assets/js/02d72f40.92ac8c83.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9370],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,o(o({ref:t},d),{},{components:a})):r.createElement(m,o({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,o=new Array(s);o[0]=p;var i={};for(var n in t)hasOwnProperty.call(t,n)&&(i[n]=t[n]);i.originalType=e,i[h]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.7.0",date:"2023-06-12 13:24:29 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.7.0",id:"version-0.7/changelogs/changelogs/v0.7.0",title:"v0.7.0",description:"(rancherio-gh-m) released this 2023-06-12 1329 +0000 UTC",source:"@site/versioned_docs/version-0.7/changelogs/changelogs/v0.7.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.7.0",permalink:"/0.7/changelogs/changelogs/v0.7.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/changelogs/changelogs/v0.7.0.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.7.0",date:"2023-06-12 13:24:29 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.7/troubleshooting"},next:{title:"v0.7.1",permalink:"/0.7/changelogs/changelogs/v0.7.1"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-06-12 13:24:29 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"The packaged helm chart ",(0,l.yg)("code",null,"fleet-0.7.0.tgz")," was reuploaded to fix the Gitjob version constraint following ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1759128522","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1593","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1593/hovercard",href:"https://github.com/rancher/fleet/pull/1593"},"#1593")),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add agent config for tolerations, affinity, resources on cluster by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1637728835","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1433","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1433/hovercard",href:"https://github.com/rancher/fleet/pull/1433"},"#1433")),(0,l.yg)("li",null,"Add JSON schema validation for agent customization in cluster CRD by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1683157339","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1490","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1490/hovercard",href:"https://github.com/rancher/fleet/pull/1490"},"#1490")),(0,l.yg)("li",null,"Configure tolerations for fleet-agent from cluster CR by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rajiteh/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rajiteh"},"@rajiteh")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1473805824","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1154","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1154/hovercard",href:"https://github.com/rancher/fleet/pull/1154"},"#1154")),(0,l.yg)("li",null,"Agent registration recovery by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1741381268","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1579","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1579/hovercard",href:"https://github.com/rancher/fleet/pull/1579"},"#1579")),(0,l.yg)("li",null,"Clean up orphaned request service accounts, remove unused managed annotations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1574308682","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1310","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1310/hovercard",href:"https://github.com/rancher/fleet/pull/1310"},"#1310")),(0,l.yg)("li",null,"Add flag to disable local cluster bootstrap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504965604","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1207","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1207/hovercard",href:"https://github.com/rancher/fleet/pull/1207"},"#1207")),(0,l.yg)("li",null,"Fix agent not starting in old fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1579937640","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1316","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1316/hovercard",href:"https://github.com/rancher/fleet/pull/1316"},"#1316")),(0,l.yg)("li",null,"Configure FLEET_CLUSTER_ENQUEUE_DELAY in helm chart by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/johnjcool/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/johnjcool"},"@johnjcool")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1622878430","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1404","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1404/hovercard",href:"https://github.com/rancher/fleet/pull/1404"},"#1404")),(0,l.yg)("li",null,"Do not always create a Bundle for the root path by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1572931152","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1309","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1309/hovercard",href:"https://github.com/rancher/fleet/pull/1309"},"#1309")),(0,l.yg)("li",null,"Always get labels from Bundle when creating a BundleDeployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1634035180","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1428","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1428/hovercard",href:"https://github.com/rancher/fleet/pull/1428"},"#1428")),(0,l.yg)("li",null,"Add helm capabilities to agent's deployer by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1560096890","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1287","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1287/hovercard",href:"https://github.com/rancher/fleet/pull/1287"},"#1287")),(0,l.yg)("li",null,"Add waitForJobs as a helm option by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1587738708","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1330","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1330/hovercard",href:"https://github.com/rancher/fleet/pull/1330"},"#1330")),(0,l.yg)("li",null,"Allow resources to be kept when deleting a GitRepo or a Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1613422358","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1382","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1382/hovercard",href:"https://github.com/rancher/fleet/pull/1382"},"#1382")),(0,l.yg)("li",null,"Improve behavior on failed deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1678637183","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1485","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1485/hovercard",href:"https://github.com/rancher/fleet/pull/1485"},"#1485")),(0,l.yg)("li",null,"Add ignore conditions for the status of deployed custom resources by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1676498420","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1482","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1482/hovercard",href:"https://github.com/rancher/fleet/pull/1482"},"#1482"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Ensure fleet-agent's helm release name has valid length by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1603305549","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1353","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1353/hovercard",href:"https://github.com/rancher/fleet/pull/1353"},"#1353")),(0,l.yg)("li",null,"Ensure ClusterRegistrationToken name is below 63 characters by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1606556526","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1360","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1360/hovercard",href:"https://github.com/rancher/fleet/pull/1360"},"#1360")),(0,l.yg)("li",null,"AllowedRepoPatterns in GitRepoRestriction is matched against Repo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/johnjcool/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/johnjcool"},"@johnjcool")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1611495191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1379","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1379/hovercard",href:"https://github.com/rancher/fleet/pull/1379"},"#1379")),(0,l.yg)("li",null,"Properly set keepResources if releaseName is empty by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1618615310","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1394","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1394/hovercard",href:"https://github.com/rancher/fleet/pull/1394"},"#1394")),(0,l.yg)("li",null,"Retry helm upgrade if it was interrupted by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1631722825","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1424","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1424/hovercard",href:"https://github.com/rancher/fleet/pull/1424"},"#1424")),(0,l.yg)("li",null,"Fix BundleNamespaceMapping ignoring bundle selector by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1631922521","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1425","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1425/hovercard",href:"https://github.com/rancher/fleet/pull/1425"},"#1425")),(0,l.yg)("li",null,"Don't ignore config map reference in valuesFrom list element by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1636072808","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1431","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1431/hovercard",href:"https://github.com/rancher/fleet/pull/1431"},"#1431")),(0,l.yg)("li",null,"Agent should only select Linux nodes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1693766556","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1505","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1505/hovercard",href:"https://github.com/rancher/fleet/pull/1505"},"#1505")),(0,l.yg)("li",null,"Also check chart with the helmRepoURLRegex by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1593772790","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1341","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1341/hovercard",href:"https://github.com/rancher/fleet/pull/1341"},"#1341")),(0,l.yg)("li",null,"Fix cluster targeting and missing customizations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1666045658","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1473","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1473/hovercard",href:"https://github.com/rancher/fleet/pull/1473"},"#1473"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add container security context to fleet-agent helm chart by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/puffitos/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/puffitos"},"@puffitos")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1562171016","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1293","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1293/hovercard",href:"https://github.com/rancher/fleet/pull/1293"},"#1293")),(0,l.yg)("li",null,"Managed fleet-agent uses same securityContext as helm chart by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1579373211","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1314","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1314/hovercard",href:"https://github.com/rancher/fleet/pull/1314"},"#1314")),(0,l.yg)("li",null,"Remove fleet-agent simulators by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504951189","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1206","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1206/hovercard",href:"https://github.com/rancher/fleet/pull/1206"},"#1206")),(0,l.yg)("li",null,"Remove flag to disable leaderElection for simulators by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1632219997","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1426","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1426/hovercard",href:"https://github.com/rancher/fleet/pull/1426"},"#1426")),(0,l.yg)("li",null,"Add Github action to release Fleet against Rancher by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1598491527","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1346","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1346/hovercard",href:"https://github.com/rancher/fleet/pull/1346"},"#1346")),(0,l.yg)("li",null,"Change version number for nightly releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1608705004","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1367","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1367/hovercard",href:"https://github.com/rancher/fleet/pull/1367"},"#1367")),(0,l.yg)("li",null,"Log regex compilation error in git repo restriction with patterns by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1613666739","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1383","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1383/hovercard",href:"https://github.com/rancher/fleet/pull/1383"},"#1383")),(0,l.yg)("li",null,"Split Examples Tests from E2E Tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1619159167","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1397","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1397/hovercard",href:"https://github.com/rancher/fleet/pull/1397"},"#1397")),(0,l.yg)("li",null,"Add nightly e2e workflow to test more k8s versions by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1701958086","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1518","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1518/hovercard",href:"https://github.com/rancher/fleet/pull/1518"},"#1518")),(0,l.yg)("li",null,"Replace deprecated command in Github action with environment file by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/jongwooo/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/jongwooo"},"@jongwooo")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1689964438","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1500","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1500/hovercard",href:"https://github.com/rancher/fleet/pull/1500"},"#1500"))),(0,l.yg)("h2",null,"New Contributors"),(0,l.yg)("ul",null,(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/johnjcool/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/johnjcool"},"@johnjcool")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1611495191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1379","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1379/hovercard",href:"https://github.com/rancher/fleet/pull/1379"},"#1379")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1662723966","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1472","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1472/hovercard",href:"https://github.com/rancher/fleet/pull/1472"},"#1472")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/jongwooo/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/jongwooo"},"@jongwooo")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1689964438","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1500","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1500/hovercard",href:"https://github.com/rancher/fleet/pull/1500"},"#1500"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.6.0...v0.7.0"},(0,l.yg)("tt",null,"v0.6.0...v0.7.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-0.7.0.tgz"},"fleet-0.7.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-crd-0.7.0.tgz"},"fleet-crd-0.7.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-agent-0.7.0.tgz"},"fleet-agent-0.7.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.7.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/033231c2.60d4ca4d.js b/assets/js/033231c2.00f3176f.js similarity index 73% rename from assets/js/033231c2.60d4ca4d.js rename to assets/js/033231c2.00f3176f.js index 9163371eb..1f8275dc1 100644 --- a/assets/js/033231c2.60d4ca4d.js +++ b/assets/js/033231c2.00f3176f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[396],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.10/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.10/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.10/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/uninstall.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.10/tut-deployment"},next:{title:"Architecture",permalink:"/0.10/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[396],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.10/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.10/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.10/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/uninstall.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.10/tut-deployment"},next:{title:"Architecture",permalink:"/0.10/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0364e902.7f40923a.js b/assets/js/0364e902.7f40923a.js deleted file mode 100644 index 775446f44..000000000 --- a/assets/js/0364e902.7f40923a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8466],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.7/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.7/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.7/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/namespaces.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.7/gitrepo-content"},next:{title:"Custom Resources",permalink:"/0.7/ref-resources"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.7/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.7/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/0364e902.8225d539.js b/assets/js/0364e902.8225d539.js new file mode 100644 index 000000000..f4ba79a0d --- /dev/null +++ b/assets/js/0364e902.8225d539.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8466],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.7/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.7/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.7/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/namespaces.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.7/gitrepo-content"},next:{title:"Custom Resources",permalink:"/0.7/ref-resources"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.7/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.7/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/045f7301.ebabec62.js b/assets/js/045f7301.8731bbc1.js similarity index 66% rename from assets/js/045f7301.ebabec62.js rename to assets/js/045f7301.8731bbc1.js index d2d6f5561..65ebac3dd 100644 --- a/assets/js/045f7301.ebabec62.js +++ b/assets/js/045f7301.8731bbc1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9425],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var a=n.createContext({}),s=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(a.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,i=e.originalType,a=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),p=s(r),g=l,d=p["".concat(a,".").concat(g)]||p[g]||u[g]||i;return r?n.createElement(d,o(o({ref:t},f),{},{components:r})):n.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var i=r.length,o=new Array(i);o[0]=g;var c={};for(var a in t)hasOwnProperty.call(t,a)&&(c[a]=t[a]);c.originalType=e,c[p]="string"==typeof e?e:l,o[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const i={title:"",sidebar_label:"fleet gitcloner"},o=void 0,c={unversionedId:"cli/fleet-cli/fleet_gitcloner",id:"cli/fleet-cli/fleet_gitcloner",title:"",description:"fleet gitcloner",source:"@site/docs/cli/fleet-cli/fleet_gitcloner.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_gitcloner",permalink:"/cli/fleet-cli/fleet_gitcloner",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_gitcloner.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet gitcloner"}},a={},s=[{value:"fleet gitcloner",id:"fleet-gitcloner",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-gitcloner"},"fleet gitcloner"),(0,l.yg)("p",null,"Clones a git repository"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet gitcloner [REPO] [PATH] [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --branch string git branch\n --ca-bundle-file string CA bundle file\n -h, --help help for gitcloner\n --insecure-skip-tls do not verify tls certificates\n --known-hosts-file string known hosts file\n --password-file string password file for basic auth\n --revision string git revision\n --ssh-private-key-file string ssh private key file path\n -u, --username string user name for basic auth\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9425],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var a=n.createContext({}),s=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(a.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,i=e.originalType,a=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),p=s(r),g=l,d=p["".concat(a,".").concat(g)]||p[g]||u[g]||i;return r?n.createElement(d,o(o({ref:t},f),{},{components:r})):n.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var i=r.length,o=new Array(i);o[0]=g;var c={};for(var a in t)hasOwnProperty.call(t,a)&&(c[a]=t[a]);c.originalType=e,c[p]="string"==typeof e?e:l,o[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const i={title:"",sidebar_label:"fleet gitcloner"},o=void 0,c={unversionedId:"cli/fleet-cli/fleet_gitcloner",id:"cli/fleet-cli/fleet_gitcloner",title:"",description:"fleet gitcloner",source:"@site/docs/cli/fleet-cli/fleet_gitcloner.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_gitcloner",permalink:"/cli/fleet-cli/fleet_gitcloner",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_gitcloner.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet gitcloner"}},a={},s=[{value:"fleet gitcloner",id:"fleet-gitcloner",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-gitcloner"},"fleet gitcloner"),(0,l.yg)("p",null,"Clones a git repository"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet gitcloner [REPO] [PATH] [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --branch string git branch\n --ca-bundle-file string CA bundle file\n -h, --help help for gitcloner\n --insecure-skip-tls do not verify tls certificates\n --known-hosts-file string known hosts file\n --password-file string password file for basic auth\n --revision string git revision\n --ssh-private-key-file string ssh private key file path\n -u, --username string user name for basic auth\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/07686352.09afe081.js b/assets/js/07686352.09afe081.js new file mode 100644 index 000000000..fc5733e18 --- /dev/null +++ b/assets/js/07686352.09afe081.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7494],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>d});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},g="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),g=p(a),u=n,d=g["".concat(s,".").concat(u)]||g[u]||m[u]||l;return a?r.createElement(d,o(o({ref:t},c),{},{components:a})):r.createElement(d,o({ref:t},c))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[g]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.9.2",date:"2024-03-22 15:49:16 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.2",id:"version-0.9/changelogs/changelogs/v0.9.2",title:"v0.9.2",description:"(rancherio-gh-m) released this 2024-03-22 1516 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.2.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.2",permalink:"/0.9/changelogs/changelogs/v0.9.2",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.2.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.9.2",date:"2024-03-22 15:49:16 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.1",permalink:"/0.9/changelogs/changelogs/v0.9.1"},next:{title:"v0.9.3",permalink:"/0.9/changelogs/changelogs/v0.9.3"}},s={},p=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],c={toc:p},g="wrapper";function m(e){let{components:t,...a}=e;return(0,n.yg)(g,(0,r.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-03-22 15:49:16 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"[0.9] Revert trigger rework 0.9 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202396570","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2258","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2258/hovercard",href:"https://github.com/rancher/fleet/pull/2258"},"#2258"))),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.1...v0.9.2"},(0,n.yg)("tt",null,"v0.9.1...v0.9.2"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-crd-0.9.2.tgz"},"fleet-crd-0.9.2.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-agent-0.9.2.tgz"},"fleet-agent-0.9.2.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-0.9.2.tgz"},"fleet-0.9.2.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.2"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/07686352.8c5ab4b8.js b/assets/js/07686352.8c5ab4b8.js deleted file mode 100644 index 2676398ed..000000000 --- a/assets/js/07686352.8c5ab4b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7494],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>d});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},g="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),g=p(a),u=n,d=g["".concat(s,".").concat(u)]||g[u]||m[u]||l;return a?r.createElement(d,o(o({ref:t},c),{},{components:a})):r.createElement(d,o({ref:t},c))}));function d(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[g]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.9.2",date:"2024-03-22 15:49:16 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.2",id:"version-0.9/changelogs/changelogs/v0.9.2",title:"v0.9.2",description:"(rancherio-gh-m) released this 2024-03-22 1516 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.2.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.2",permalink:"/0.9/changelogs/changelogs/v0.9.2",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.2.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.9.2",date:"2024-03-22 15:49:16 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.1",permalink:"/0.9/changelogs/changelogs/v0.9.1"},next:{title:"v0.9.3",permalink:"/0.9/changelogs/changelogs/v0.9.3"}},s={},p=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],c={toc:p},g="wrapper";function m(e){let{components:t,...a}=e;return(0,n.yg)(g,(0,r.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-03-22 15:49:16 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"[0.9] Revert trigger rework 0.9 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202396570","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2258","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2258/hovercard",href:"https://github.com/rancher/fleet/pull/2258"},"#2258"))),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.1...v0.9.2"},(0,n.yg)("tt",null,"v0.9.1...v0.9.2"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-crd-0.9.2.tgz"},"fleet-crd-0.9.2.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-agent-0.9.2.tgz"},"fleet-agent-0.9.2.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-0.9.2.tgz"},"fleet-0.9.2.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.2/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.2"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/07db75e5.7cb2cc57.js b/assets/js/07db75e5.7cb2cc57.js new file mode 100644 index 000000000..357557340 --- /dev/null +++ b/assets/js/07db75e5.7cb2cc57.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2596],{7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4106:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>g,toc:()=>c});var a=n(8168),l=(n(6540),n(5680)),i=n(7858),r=n(2355);const s={},o="Agent Initiated",g={unversionedId:"agent-initiated",id:"version-0.5/agent-initiated",title:"Agent Initiated",description:"Refer to the overview page for a background information on the agent initiated registration style.",source:"@site/versioned_docs/version-0.5/agent-initiated.md",sourceDirName:".",slug:"/agent-initiated",permalink:"/0.5/agent-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/agent-initiated.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Tokens",permalink:"/0.5/cluster-tokens"},next:{title:"Manager Initiated",permalink:"/0.5/manager-initiated"}},p={},c=[{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:2},{value:"Install agent for a new Cluster",id:"install-agent-for-a-new-cluster",level:2},{value:"Install agent for a predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,a.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"agent-initiated"},"Agent Initiated"),(0,l.yg)("p",null,"Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the agent initiated registration style."),(0,l.yg)("h2",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,l.yg)("p",null,"A downstream cluster is registered using the ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,l.yg)("strong",{parentName:"p"},"client ID")," or ",(0,l.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required. Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token page")," for more information\non how to create tokens and obtain the values. The cluster registration token is manifested as a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will\nbe passed to the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install")," process."),(0,l.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,l.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,l.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,l.yg)("h2",{id:"install-agent-for-a-new-cluster"},"Install agent for a new Cluster"),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,l.yg)("p",null,"First, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,l.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,l.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,l.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,l.yg)("p",null,"Value in ",(0,l.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,l.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,l.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"warning"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent'," ",i.e["v0.5"].fleetAgent),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.5/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,l.yg)("h2",{id:"install-agent-for-a-predefined-cluster"},"Install agent for a predefined Cluster"),(0,l.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,l.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,l.yg)("p",null,"First, create a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,l.yg)("p",null,"Second, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,l.yg)("p",null,"Third, setup your environment to use the client ID."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent'," ",i.e["v0.5"].fleetAgent),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.5/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/07db75e5.c45840b7.js b/assets/js/07db75e5.c45840b7.js deleted file mode 100644 index d87db9f1a..000000000 --- a/assets/js/07db75e5.c45840b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2596],{7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4106:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>g,toc:()=>c});var a=n(8168),l=(n(6540),n(5680)),i=n(7858),r=n(2355);const s={},o="Agent Initiated",g={unversionedId:"agent-initiated",id:"version-0.5/agent-initiated",title:"Agent Initiated",description:"Refer to the overview page for a background information on the agent initiated registration style.",source:"@site/versioned_docs/version-0.5/agent-initiated.md",sourceDirName:".",slug:"/agent-initiated",permalink:"/0.5/agent-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/agent-initiated.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Tokens",permalink:"/0.5/cluster-tokens"},next:{title:"Manager Initiated",permalink:"/0.5/manager-initiated"}},p={},c=[{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:2},{value:"Install agent for a new Cluster",id:"install-agent-for-a-new-cluster",level:2},{value:"Install agent for a predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,a.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"agent-initiated"},"Agent Initiated"),(0,l.yg)("p",null,"Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the agent initiated registration style."),(0,l.yg)("h2",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,l.yg)("p",null,"A downstream cluster is registered using the ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,l.yg)("strong",{parentName:"p"},"client ID")," or ",(0,l.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required. Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token page")," for more information\non how to create tokens and obtain the values. The cluster registration token is manifested as a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will\nbe passed to the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install")," process."),(0,l.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,l.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,l.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,l.yg)("h2",{id:"install-agent-for-a-new-cluster"},"Install agent for a new Cluster"),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,l.yg)("p",null,"First, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,l.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,l.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,l.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,l.yg)("p",null,"Value in ",(0,l.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,l.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,l.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"warning"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent'," ",i.e["v0.5"].fleetAgent),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.5/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,l.yg)("h2",{id:"install-agent-for-a-predefined-cluster"},"Install agent for a predefined Cluster"),(0,l.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,l.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,l.yg)("p",null,"First, create a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,l.yg)("p",null,"Second, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,l.yg)("p",null,"Third, setup your environment to use the client ID."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent'," ",i.e["v0.5"].fleetAgent),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.5/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/08aff371.3e2739ee.js b/assets/js/08aff371.3e2739ee.js new file mode 100644 index 000000000..63a29d89b --- /dev/null +++ b/assets/js/08aff371.3e2739ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7739],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=r.createContext({}),u=function(e){var t=r.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(o.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=u(a),h=l,g=d["".concat(o,".").concat(h)]||d[h]||c[h]||n;return a?r.createElement(g,i(i({ref:t},p),{},{components:a})):r.createElement(g,i({ref:t},p))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,i=new Array(n);i[0]=h;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[d]="string"==typeof e?e:l,i[1]=s;for(var u=2;u{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>c,frontMatter:()=>n,metadata:()=>s,toc:()=>u});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.5.0",date:"2022-11-10 17:33:25 +0000 UTC"},i=void 0,s={unversionedId:"changelogs/changelogs/v0.5.0",id:"version-0.5/changelogs/changelogs/v0.5.0",title:"v0.5.0",description:"(rancherio-gh-m) released this 2022-11-10 1725 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.0",permalink:"/0.5/changelogs/changelogs/v0.5.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.0.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.5.0",date:"2022-11-10 17:33:25 +0000 UTC"},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.5/uninstall"},next:{title:"v0.5.1",permalink:"/0.5/changelogs/changelogs/v0.5.1"}},o={},u=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:u},d="wrapper";function c(e){let{components:t,...a}=e;return(0,l.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2022-11-10 17:33:25 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add support for OCI registry based charts in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1374417940","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/975","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/975/hovercard",href:"https://github.com/rancher/fleet/pull/975"},"#975")),(0,l.yg)("li",null,"Adds priorityClassName to deployments in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1375241093","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/983","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/983/hovercard",href:"https://github.com/rancher/fleet/pull/983"},"#983")),(0,l.yg)("li",null,"Support cluster specific registry in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1376060309","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/984","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/984/hovercard",href:"https://github.com/rancher/fleet/pull/984"},"#984"),", ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1425273236","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1060","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1060/hovercard",href:"https://github.com/rancher/fleet/pull/1060"},"#1060")),(0,l.yg)("li",null,"Add cluster labels to agent config creation")),(0,l.yg)("h2",null,"Bug Fixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix long bundle names in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1368153506","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/964","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/964/hovercard",href:"https://github.com/rancher/fleet/pull/964"},"#964")),(0,l.yg)("li",null,"Remove ignored fields from status struct, to avoid loop in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1378101691","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/990","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/990/hovercard",href:"https://github.com/rancher/fleet/pull/990"},"#990")),(0,l.yg)("li",null,"Fix for cluster registration token performance degradation in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1383563179","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/998","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/998/hovercard",href:"https://github.com/rancher/fleet/pull/998"},"#998")),(0,l.yg)("li",null,"Fix authentication for OCI images in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1383563179","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/998","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/998/hovercard",href:"https://github.com/rancher/fleet/pull/998"},"#998")),(0,l.yg)("li",null,"Stop requeuing on failed deployments in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1418520927","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1045","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1045/hovercard",href:"https://github.com/rancher/fleet/pull/1045"},"#1045"))),(0,l.yg)("h2",null,"Changes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Updating GitJob to ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.1.32"},"0.1.32")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1373552451","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/972","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/972/hovercard",href:"https://github.com/rancher/fleet/pull/972"},"#972")),(0,l.yg)("li",null,"Setting the Kubernetes libs at 0.24.5 in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1375016478","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/981","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/981/hovercard",href:"https://github.com/rancher/fleet/pull/981"},"#981")),(0,l.yg)("li",null,"Bump bci/bci-base 15.4.27.11.23 in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1377416834","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/989","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/989/hovercard",href:"https://github.com/rancher/fleet/pull/989"},"#989"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.4.0...v0.5.0"},(0,l.yg)("tt",null,"v0.4.0...v0.5.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-crd-0.5.0.tgz"},"fleet-crd-0.5.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-agent-0.5.0.tgz"},"fleet-agent-0.5.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-0.5.0.tgz"},"fleet-0.5.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.0"},"here"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/08aff371.feec1fe2.js b/assets/js/08aff371.feec1fe2.js deleted file mode 100644 index 7ba67c4a8..000000000 --- a/assets/js/08aff371.feec1fe2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7739],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=r.createContext({}),u=function(e){var t=r.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return r.createElement(o.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=u(a),h=l,g=d["".concat(o,".").concat(h)]||d[h]||c[h]||n;return a?r.createElement(g,i(i({ref:t},p),{},{components:a})):r.createElement(g,i({ref:t},p))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,i=new Array(n);i[0]=h;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[d]="string"==typeof e?e:l,i[1]=s;for(var u=2;u{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>c,frontMatter:()=>n,metadata:()=>s,toc:()=>u});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.5.0",date:"2022-11-10 17:33:25 +0000 UTC"},i=void 0,s={unversionedId:"changelogs/changelogs/v0.5.0",id:"version-0.5/changelogs/changelogs/v0.5.0",title:"v0.5.0",description:"(rancherio-gh-m) released this 2022-11-10 1725 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.0",permalink:"/0.5/changelogs/changelogs/v0.5.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.0.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.5.0",date:"2022-11-10 17:33:25 +0000 UTC"},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.5/uninstall"},next:{title:"v0.5.1",permalink:"/0.5/changelogs/changelogs/v0.5.1"}},o={},u=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:u},d="wrapper";function c(e){let{components:t,...a}=e;return(0,l.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2022-11-10 17:33:25 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add support for OCI registry based charts in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1374417940","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/975","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/975/hovercard",href:"https://github.com/rancher/fleet/pull/975"},"#975")),(0,l.yg)("li",null,"Adds priorityClassName to deployments in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1375241093","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/983","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/983/hovercard",href:"https://github.com/rancher/fleet/pull/983"},"#983")),(0,l.yg)("li",null,"Support cluster specific registry in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1376060309","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/984","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/984/hovercard",href:"https://github.com/rancher/fleet/pull/984"},"#984"),", ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1425273236","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1060","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1060/hovercard",href:"https://github.com/rancher/fleet/pull/1060"},"#1060")),(0,l.yg)("li",null,"Add cluster labels to agent config creation")),(0,l.yg)("h2",null,"Bug Fixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix long bundle names in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1368153506","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/964","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/964/hovercard",href:"https://github.com/rancher/fleet/pull/964"},"#964")),(0,l.yg)("li",null,"Remove ignored fields from status struct, to avoid loop in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1378101691","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/990","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/990/hovercard",href:"https://github.com/rancher/fleet/pull/990"},"#990")),(0,l.yg)("li",null,"Fix for cluster registration token performance degradation in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1383563179","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/998","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/998/hovercard",href:"https://github.com/rancher/fleet/pull/998"},"#998")),(0,l.yg)("li",null,"Fix authentication for OCI images in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1383563179","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/998","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/998/hovercard",href:"https://github.com/rancher/fleet/pull/998"},"#998")),(0,l.yg)("li",null,"Stop requeuing on failed deployments in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1418520927","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1045","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1045/hovercard",href:"https://github.com/rancher/fleet/pull/1045"},"#1045"))),(0,l.yg)("h2",null,"Changes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Updating GitJob to ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.1.32"},"0.1.32")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1373552451","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/972","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/972/hovercard",href:"https://github.com/rancher/fleet/pull/972"},"#972")),(0,l.yg)("li",null,"Setting the Kubernetes libs at 0.24.5 in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1375016478","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/981","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/981/hovercard",href:"https://github.com/rancher/fleet/pull/981"},"#981")),(0,l.yg)("li",null,"Bump bci/bci-base 15.4.27.11.23 in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1377416834","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/989","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/989/hovercard",href:"https://github.com/rancher/fleet/pull/989"},"#989"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.4.0...v0.5.0"},(0,l.yg)("tt",null,"v0.4.0...v0.5.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-crd-0.5.0.tgz"},"fleet-crd-0.5.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-agent-0.5.0.tgz"},"fleet-agent-0.5.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-0.5.0.tgz"},"fleet-0.5.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.0"},"here"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/095d9053.a21252eb.js b/assets/js/095d9053.a21252eb.js new file mode 100644 index 000000000..6161792d0 --- /dev/null +++ b/assets/js/095d9053.a21252eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4174],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.8/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.8/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.8/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/gitrepo-targets.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.8/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.8/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/095d9053.fb1e3983.js b/assets/js/095d9053.fb1e3983.js deleted file mode 100644 index f1b505c4a..000000000 --- a/assets/js/095d9053.fb1e3983.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4174],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.8/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.8/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.8/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/gitrepo-targets.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.8/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.8/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/09dedfdd.3c286234.js b/assets/js/09dedfdd.3c286234.js deleted file mode 100644 index a6a0b1ee4..000000000 --- a/assets/js/09dedfdd.3c286234.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5197],{5680:(e,t,a)=>{a.d(t,{xA:()=>y,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},y=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,y=i(e,["components","mdxType","originalType","parentName"]),m=u(a),d=l,o=m["".concat(p,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},y),{},{components:a})):n.createElement(o,g({ref:t},y))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.10/ref-crds",title:"Custom Resources Spec",description:"* Bundle",source:"@site/versioned_docs/version-0.10/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.10/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-crds.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/0.10/ref-resources"},next:{title:"fleet.yaml",permalink:"/0.10/ref-fleet-yaml"}},p={},u=[{value:"Bundle",id:"bundle",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleList",id:"bundlelist",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentList",id:"bundledeploymentlist",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleNamespaceMappingList",id:"bundlenamespacemappinglist",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterList",id:"clusterlist",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupList",id:"clustergrouplist",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationList",id:"clusterregistrationlist",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenList",id:"clusterregistrationtokenlist",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"Content",id:"content",level:4},{value:"ContentList",id:"contentlist",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoList",id:"gitrepolist",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"OCIRegistrySpec",id:"ociregistryspec",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoRestrictionList",id:"gitreporestrictionlist",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanList",id:"imagescanlist",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"FleetYAML",id:"fleetyaml",level:4},{value:"ImageScanYAML",id:"imagescanyaml",level:4}],y={toc:u},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},y,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlelist"},"BundleList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentlist"},"BundleDeploymentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemappinglist"},"BundleNamespaceMappingList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterlist"},"ClusterList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergrouplist"},"ClusterGroupList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationlist"},"ClusterRegistrationList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenlist"},"ClusterRegistrationTokenList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#contentlist"},"ContentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepolist"},"GitRepoList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestrictionlist"},"GitRepoRestrictionList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanlist"},"ImageScanList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#fleetyaml"},"FleetYAML")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanyaml"},"ImageScanYAML"))),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters."),(0,l.yg)("p",null,"When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlelist"},"BundleList"),(0,l.yg)("p",null,"BundleList contains a list of Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundle"},"Bundle")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"contentsId"),(0,l.yg)("td",{parentName:"tr",align:null},"ContentsID stores the contents id when deploying contents using an OCI registry."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociReference"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIReference is the OCI reference used to store contents, this is only for informational purposes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourcesSha256Sum"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentlist"},"BundleDeploymentList"),(0,l.yg)("p",null,"BundleDeploymentList contains a list of BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace can be used to delete the deployed namespace when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteCRDResources"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociContents"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIContents is true when this deployment's contents is stored in an oci registry"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDNS"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to ",(0,l.yg)("inlineCode",{parentName:"td"},"true")," by default."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"skipSchemaValidation"),(0,l.yg)("td",{parentName:"tr",align:null},"SkipSchemaValidation allows skipping schema validation against the chart values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDependencyUpdate"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDependencyUpdate allows skipping chart dependencies update"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemappinglist"},"BundleNamespaceMappingList"),(0,l.yg)("p",null,"BundleNamespaceMappingList contains a list of BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterlist"},"ClusterList"),(0,l.yg)("p",null,"ClusterList contains a list of Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#cluster"},"Cluster")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecretNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"hostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"HostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration)."),(0,l.yg)("td",{parentName:"tr",align:null},"*bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentHostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTLSMode"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTLSMode supports two values: ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store")," and ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),". If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store"),", instructs the agent to trust CA bundles from the operating system's store. If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),", then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"garbageCollectionInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"GarbageCollectionInterval determines how often agents clean up obsolete Helm releases."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergrouplist"},"ClusterGroupList"),(0,l.yg)("p",null,"ClusterGroupList contains a list of ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationlist"},"ClusterRegistrationList"),(0,l.yg)("p",null,"ClusterRegistrationList contains a list of ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenlist"},"ClusterRegistrationTokenList"),(0,l.yg)("p",null,"ClusterRegistrationTokenList contains a list of ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sha256sum"),(0,l.yg)("td",{parentName:"tr",align:null},"SHA256Sum of the Content field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"contentlist"},"ContentList"),(0,l.yg)("p",null,"ContentList contains a list of Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#content"},"Content")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepolist"},"GitRepoList"),(0,l.yg)("p",null,"GitRepoList contains a list of GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitrepo"},"GitRepo")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePolling"),(0,l.yg)("td",{parentName:"tr",align:null},"Disables git polling. When enabled only webhooks will be used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociRegistry"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIRegistry specifies the OCI registry related parameters"),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"updateGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Update generation is the force update generation if spec.forceSyncGeneration is set"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last git job run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last Git job run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastPollingTriggered"),(0,l.yg)("td",{parentName:"tr",align:null},"LastPollingTime is the last time the polling check was triggered"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ociregistryspec"},"OCIRegistrySpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"reference"),(0,l.yg)("td",{parentName:"tr",align:null},"Reference of the OCI Registry"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthSecretName contains the auth secret where the OCI regristry credentials are stored."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"basicHTTP"),(0,l.yg)("td",{parentName:"tr",align:null},"BasicHTTP uses HTTP connections to the OCI registry when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLS"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLS allows connections to OCI registry without certs when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestrictionlist"},"GitRepoRestrictionList"),(0,l.yg)("p",null,"GitRepoRestrictionList contains a list of GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanlist"},"ImageScanList"),(0,l.yg)("p",null,"ImageScanList contains a list of ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescan"},"ImageScan")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"fleetyaml"},"FleetYAML"),(0,l.yg)("p",null,"FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle which will be created."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"labels"),(0,l.yg)("td",{parentName:"tr",align:null},"Labels are copied to the bundle and can be used in a dependsOn.selector."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetCustomizations"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScans"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScans are optional and used to update container image references in the git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescanyaml"},"ImageScanYAML")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overrideTargets"),(0,l.yg)("td",{parentName:"tr",align:null},"OverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanyaml"},"ImageScanYAML"),(0,l.yg)("p",null,"ImageScanYAML is a single entry in the ImageScan list from fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the image scan. Unused."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/09dedfdd.749c18a6.js b/assets/js/09dedfdd.749c18a6.js new file mode 100644 index 000000000..af283f227 --- /dev/null +++ b/assets/js/09dedfdd.749c18a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5197],{5680:(e,t,a)=>{a.d(t,{xA:()=>y,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},y=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,y=i(e,["components","mdxType","originalType","parentName"]),m=u(a),d=l,o=m["".concat(p,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},y),{},{components:a})):n.createElement(o,g({ref:t},y))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.10/ref-crds",title:"Custom Resources Spec",description:"* Bundle",source:"@site/versioned_docs/version-0.10/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.10/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-crds.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/0.10/ref-resources"},next:{title:"fleet.yaml",permalink:"/0.10/ref-fleet-yaml"}},p={},u=[{value:"Bundle",id:"bundle",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleList",id:"bundlelist",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentList",id:"bundledeploymentlist",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleNamespaceMappingList",id:"bundlenamespacemappinglist",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterList",id:"clusterlist",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupList",id:"clustergrouplist",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationList",id:"clusterregistrationlist",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenList",id:"clusterregistrationtokenlist",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"Content",id:"content",level:4},{value:"ContentList",id:"contentlist",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoList",id:"gitrepolist",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"OCIRegistrySpec",id:"ociregistryspec",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoRestrictionList",id:"gitreporestrictionlist",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanList",id:"imagescanlist",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"FleetYAML",id:"fleetyaml",level:4},{value:"ImageScanYAML",id:"imagescanyaml",level:4}],y={toc:u},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},y,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlelist"},"BundleList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentlist"},"BundleDeploymentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemappinglist"},"BundleNamespaceMappingList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterlist"},"ClusterList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergrouplist"},"ClusterGroupList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationlist"},"ClusterRegistrationList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenlist"},"ClusterRegistrationTokenList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#contentlist"},"ContentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepolist"},"GitRepoList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestrictionlist"},"GitRepoRestrictionList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanlist"},"ImageScanList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#fleetyaml"},"FleetYAML")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanyaml"},"ImageScanYAML"))),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters."),(0,l.yg)("p",null,"When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlelist"},"BundleList"),(0,l.yg)("p",null,"BundleList contains a list of Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundle"},"Bundle")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"contentsId"),(0,l.yg)("td",{parentName:"tr",align:null},"ContentsID stores the contents id when deploying contents using an OCI registry."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociReference"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIReference is the OCI reference used to store contents, this is only for informational purposes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourcesSha256Sum"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentlist"},"BundleDeploymentList"),(0,l.yg)("p",null,"BundleDeploymentList contains a list of BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace can be used to delete the deployed namespace when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteCRDResources"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociContents"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIContents is true when this deployment's contents is stored in an oci registry"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDNS"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to ",(0,l.yg)("inlineCode",{parentName:"td"},"true")," by default."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"skipSchemaValidation"),(0,l.yg)("td",{parentName:"tr",align:null},"SkipSchemaValidation allows skipping schema validation against the chart values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDependencyUpdate"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDependencyUpdate allows skipping chart dependencies update"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemappinglist"},"BundleNamespaceMappingList"),(0,l.yg)("p",null,"BundleNamespaceMappingList contains a list of BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterlist"},"ClusterList"),(0,l.yg)("p",null,"ClusterList contains a list of Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#cluster"},"Cluster")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecretNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"hostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"HostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration)."),(0,l.yg)("td",{parentName:"tr",align:null},"*bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentHostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTLSMode"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTLSMode supports two values: ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store")," and ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),". If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store"),", instructs the agent to trust CA bundles from the operating system's store. If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),", then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"garbageCollectionInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"GarbageCollectionInterval determines how often agents clean up obsolete Helm releases."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergrouplist"},"ClusterGroupList"),(0,l.yg)("p",null,"ClusterGroupList contains a list of ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationlist"},"ClusterRegistrationList"),(0,l.yg)("p",null,"ClusterRegistrationList contains a list of ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenlist"},"ClusterRegistrationTokenList"),(0,l.yg)("p",null,"ClusterRegistrationTokenList contains a list of ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sha256sum"),(0,l.yg)("td",{parentName:"tr",align:null},"SHA256Sum of the Content field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"contentlist"},"ContentList"),(0,l.yg)("p",null,"ContentList contains a list of Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#content"},"Content")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepolist"},"GitRepoList"),(0,l.yg)("p",null,"GitRepoList contains a list of GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitrepo"},"GitRepo")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePolling"),(0,l.yg)("td",{parentName:"tr",align:null},"Disables git polling. When enabled only webhooks will be used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociRegistry"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIRegistry specifies the OCI registry related parameters"),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"updateGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Update generation is the force update generation if spec.forceSyncGeneration is set"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last git job run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"webhookCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"WebhookCommit is the latest Git commit hash received from a webhook"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last Git job run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastPollingTriggered"),(0,l.yg)("td",{parentName:"tr",align:null},"LastPollingTime is the last time the polling check was triggered"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ociregistryspec"},"OCIRegistrySpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"reference"),(0,l.yg)("td",{parentName:"tr",align:null},"Reference of the OCI Registry"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthSecretName contains the auth secret where the OCI regristry credentials are stored."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"basicHTTP"),(0,l.yg)("td",{parentName:"tr",align:null},"BasicHTTP uses HTTP connections to the OCI registry when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLS"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLS allows connections to OCI registry without certs when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestrictionlist"},"GitRepoRestrictionList"),(0,l.yg)("p",null,"GitRepoRestrictionList contains a list of GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanlist"},"ImageScanList"),(0,l.yg)("p",null,"ImageScanList contains a list of ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescan"},"ImageScan")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"fleetyaml"},"FleetYAML"),(0,l.yg)("p",null,"FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle which will be created."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"labels"),(0,l.yg)("td",{parentName:"tr",align:null},"Labels are copied to the bundle and can be used in a dependsOn.selector."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetCustomizations"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScans"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScans are optional and used to update container image references in the git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescanyaml"},"ImageScanYAML")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overrideTargets"),(0,l.yg)("td",{parentName:"tr",align:null},"OverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanyaml"},"ImageScanYAML"),(0,l.yg)("p",null,"ImageScanYAML is a single entry in the ImageScan list from fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the image scan. Unused."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0a06c365.5f142215.js b/assets/js/0a06c365.5f142215.js deleted file mode 100644 index 8b89445de..000000000 --- a/assets/js/0a06c365.5f142215.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4717],{7858:(e,t,n)=>{n.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4615:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var l=n(8168),a=(n(6540),n(5680)),r=n(7858),s=n(2355);const i={},o="Multi Cluster Install",c={unversionedId:"multi-cluster-install",id:"version-0.5/multi-cluster-install",title:"Multi Cluster Install",description:"Note: Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under Continuous Delivery on Rancher.",source:"@site/versioned_docs/version-0.5/multi-cluster-install.md",sourceDirName:".",slug:"/multi-cluster-install",permalink:"/0.5/multi-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/multi-cluster-install.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Single Cluster Install",permalink:"/0.5/single-cluster-install"},next:{title:"Uninstall",permalink:"/0.5/uninstall"}},u={},p=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:2},{value:"Install",id:"install",level:2}],d={toc:p},g="wrapper";function m(e){let{components:t,...i}=e;return(0,a.yg)(g,(0,l.A)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"multi-cluster-install"},"Multi Cluster Install"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Note:")," Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,a.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Warning:")," The multi-cluster install described below is ",(0,a.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA. "),(0,a.yg)("p",null,"In the below use case, you will setup a centralized Fleet manager. The centralized Fleet manager is a\nKubernetes cluster running the Fleet controllers. After installing the Fleet manager, you will then\nneed to register remote downstream clusters with the Fleet manager."),(0,a.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,a.yg)("h3",{id:"helm-3"},"Helm 3"),(0,a.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,a.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,a.yg)("p",null,"macOS"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,a.yg)("p",null,"Windows"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,a.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,a.yg)("p",null,"The Fleet manager is a controller running on a Kubernetes cluster so an existing cluster is required. All\ndownstream cluster that will be managed will need to communicate to this central Kubernetes cluster. This\nmeans the Kubernetes API server URL must be accessible to the downstream clusters. Any Kubernetes community\nsupported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,a.yg)("h2",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,a.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,a.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config"),"). The ",(0,a.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,a.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,a.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,a.yg)("p",null,"Please note that the ",(0,a.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,a.yg)("p",null,"If you have ",(0,a.yg)("inlineCode",{parentName:"p"},"jq")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"base64")," available then this one-liners will pull all CA certificates from your\n",(0,a.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," and place then in a file named ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n")),(0,a.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')),(0,a.yg)("h2",{id:"install"},"Install"),(0,a.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,a.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,a.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,a.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,a.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,a.yg)("p",null,"Run the following commands"),(0,a.yg)("p",null,"Setup the environment with your specific values."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,a.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,a.yg)("p",null,"First validate the server URL is correct."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fLk ${API_SERVER_URL}/version\n")),(0,a.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,a.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,a.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,a.yg)("inlineCode",{parentName:"p"},"--cacert ${API_SERVER_CA}")," part of the command."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fL --cacert ${API_SERVER_CA} ${API_SERVER_URL}/version\n")),(0,a.yg)("p",null,"If you get a valid JSON response or an ",(0,a.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,a.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,a.yg)("inlineCode",{parentName:"p"},"${API_SERVER_CA}")," file should look similar to the below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,a.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,a.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,a.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.5"].fleetCRD),(0,a.yg)("p",null,"Second install the Fleet controllers."),(0,a.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="${API_SERVER_URL}" \\\n --set-file apiServerCA="${API_SERVER_CA}" \\\n fleet'," ",r.e["v0.5"].fleet),(0,a.yg)("p",null,"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,a.yg)("a",{parentName:"p",href:"/0.5/cluster-overview"},"register clusters")," and ",(0,a.yg)("a",{parentName:"p",href:"/0.5/gitrepo-add"},"git repos")," with\nthe Fleet manager."))}m.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>l});const l=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/0a06c365.7310d13f.js b/assets/js/0a06c365.7310d13f.js new file mode 100644 index 000000000..8273076f0 --- /dev/null +++ b/assets/js/0a06c365.7310d13f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4717],{7858:(e,t,n)=>{n.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4615:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var l=n(8168),a=(n(6540),n(5680)),r=n(7858),s=n(2355);const i={},o="Multi Cluster Install",c={unversionedId:"multi-cluster-install",id:"version-0.5/multi-cluster-install",title:"Multi Cluster Install",description:"Note: Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under Continuous Delivery on Rancher.",source:"@site/versioned_docs/version-0.5/multi-cluster-install.md",sourceDirName:".",slug:"/multi-cluster-install",permalink:"/0.5/multi-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/multi-cluster-install.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Single Cluster Install",permalink:"/0.5/single-cluster-install"},next:{title:"Uninstall",permalink:"/0.5/uninstall"}},u={},p=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:2},{value:"Install",id:"install",level:2}],d={toc:p},g="wrapper";function m(e){let{components:t,...i}=e;return(0,a.yg)(g,(0,l.A)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"multi-cluster-install"},"Multi Cluster Install"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Note:")," Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,a.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Warning:")," The multi-cluster install described below is ",(0,a.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA. "),(0,a.yg)("p",null,"In the below use case, you will setup a centralized Fleet manager. The centralized Fleet manager is a\nKubernetes cluster running the Fleet controllers. After installing the Fleet manager, you will then\nneed to register remote downstream clusters with the Fleet manager."),(0,a.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,a.yg)("h3",{id:"helm-3"},"Helm 3"),(0,a.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,a.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,a.yg)("p",null,"macOS"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,a.yg)("p",null,"Windows"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,a.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,a.yg)("p",null,"The Fleet manager is a controller running on a Kubernetes cluster so an existing cluster is required. All\ndownstream cluster that will be managed will need to communicate to this central Kubernetes cluster. This\nmeans the Kubernetes API server URL must be accessible to the downstream clusters. Any Kubernetes community\nsupported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,a.yg)("h2",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,a.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,a.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config"),"). The ",(0,a.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,a.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,a.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,a.yg)("p",null,"Please note that the ",(0,a.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,a.yg)("p",null,"If you have ",(0,a.yg)("inlineCode",{parentName:"p"},"jq")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"base64")," available then this one-liners will pull all CA certificates from your\n",(0,a.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," and place then in a file named ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n")),(0,a.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')),(0,a.yg)("h2",{id:"install"},"Install"),(0,a.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,a.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,a.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,a.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,a.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,a.yg)("p",null,"Run the following commands"),(0,a.yg)("p",null,"Setup the environment with your specific values."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,a.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,a.yg)("p",null,"First validate the server URL is correct."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fLk ${API_SERVER_URL}/version\n")),(0,a.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,a.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,a.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,a.yg)("inlineCode",{parentName:"p"},"--cacert ${API_SERVER_CA}")," part of the command."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fL --cacert ${API_SERVER_CA} ${API_SERVER_URL}/version\n")),(0,a.yg)("p",null,"If you get a valid JSON response or an ",(0,a.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,a.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,a.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,a.yg)("inlineCode",{parentName:"p"},"${API_SERVER_CA}")," file should look similar to the below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,a.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,a.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,a.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.5"].fleetCRD),(0,a.yg)("p",null,"Second install the Fleet controllers."),(0,a.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="${API_SERVER_URL}" \\\n --set-file apiServerCA="${API_SERVER_CA}" \\\n fleet'," ",r.e["v0.5"].fleet),(0,a.yg)("p",null,"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,a.yg)("a",{parentName:"p",href:"/0.5/cluster-overview"},"register clusters")," and ",(0,a.yg)("a",{parentName:"p",href:"/0.5/gitrepo-add"},"git repos")," with\nthe Fleet manager."))}m.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>l});const l=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/0ab79735.5b238ed7.js b/assets/js/0ab79735.5b238ed7.js deleted file mode 100644 index 4963feeb6..000000000 --- a/assets/js/0ab79735.5b238ed7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9147],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},3814:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.8/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.8/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.8/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/installation.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/0.8/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/0.8/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"First add Fleet's Helm repository."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA.")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/0ab79735.e1d7be9e.js b/assets/js/0ab79735.e1d7be9e.js new file mode 100644 index 000000000..74ad325b5 --- /dev/null +++ b/assets/js/0ab79735.e1d7be9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9147],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},3814:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.8/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.8/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.8/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/installation.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/0.8/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/0.8/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"First add Fleet's Helm repository."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA.")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/0acb2694.7a4034f2.js b/assets/js/0acb2694.b960ec4b.js similarity index 63% rename from assets/js/0acb2694.7a4034f2.js rename to assets/js/0acb2694.b960ec4b.js index 85c4b1991..4e8cd31e2 100644 --- a/assets/js/0acb2694.7a4034f2.js +++ b/assets/js/0acb2694.b960ec4b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1694],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:l,o[1]=i;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.8/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.8/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.8/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-cli/fleet.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.8/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.8/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1694],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:l,o[1]=i;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.8/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.8/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.8/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-cli/fleet.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.8/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.8/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0bd7b06f.c9f51c8c.js b/assets/js/0bd7b06f.c9f51c8c.js deleted file mode 100644 index 24b395ef9..000000000 --- a/assets/js/0bd7b06f.c9f51c8c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8988],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.7/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.7/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.7/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/gitrepo-add.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.7/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.7/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],d={toc:s},c="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.7/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.7/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.7/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.7/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0bd7b06f.f9336e7f.js b/assets/js/0bd7b06f.f9336e7f.js new file mode 100644 index 000000000..199cd4a97 --- /dev/null +++ b/assets/js/0bd7b06f.f9336e7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8988],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.7/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.7/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.7/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/gitrepo-add.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.7/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.7/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],d={toc:s},c="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.7/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.7/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.7/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.7/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ce1d2b6.2b960978.js b/assets/js/0ce1d2b6.2b960978.js deleted file mode 100644 index e00e743f0..000000000 --- a/assets/js/0ce1d2b6.2b960978.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8396],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>u});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},y=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(n),y=r,u=c["".concat(s,".").concat(y)]||c[y]||m[y]||l;return n?a.createElement(u,o(o({ref:t},d),{},{components:n})):a.createElement(u,o({ref:t},d))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=y;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},o="Git Repository Contents",i={unversionedId:"gitrepo-content",id:"version-0.6/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.6/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.6/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/gitrepo-content.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.6/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.6/namespaces"}},s={},p=[{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],d={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,r.yg)(c,(0,a.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.6/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.6/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.6/cluster-bundles-state"},"Cluster and Bundle state"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0ce1d2b6.b38d3f4d.js b/assets/js/0ce1d2b6.b38d3f4d.js new file mode 100644 index 000000000..510de861e --- /dev/null +++ b/assets/js/0ce1d2b6.b38d3f4d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8396],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>u});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},y=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(n),y=r,u=c["".concat(s,".").concat(y)]||c[y]||m[y]||l;return n?a.createElement(u,o(o({ref:t},d),{},{components:n})):a.createElement(u,o({ref:t},d))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=y;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},o="Git Repository Contents",i={unversionedId:"gitrepo-content",id:"version-0.6/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.6/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.6/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/gitrepo-content.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.6/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.6/namespaces"}},s={},p=[{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],d={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,r.yg)(c,(0,a.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.6/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.6/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.6/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.6/cluster-bundles-state"},"Cluster and Bundle state"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0db4760e.f192c84d.js b/assets/js/0db4760e.f192c84d.js deleted file mode 100644 index da5f5264b..000000000 --- a/assets/js/0db4760e.f192c84d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2811],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>y});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),l=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=l(a),g=r,y=u["".concat(p,".").concat(g)]||u[g]||m[g]||i;return a?n.createElement(y,o(o({ref:t},c),{},{components:a})):n.createElement(y,o({ref:t},c))}));function y(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=g;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var l=2;l{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var n=a(8168),r=(a(6540),a(5680));const i={},o="Create a GitRepo Resource",s={unversionedId:"gitrepo-add",id:"version-0.6/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.6/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.6/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/gitrepo-add.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.6/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.6/gitrepo-targets"}},p={},l=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2}],c={toc:l},u="wrapper";function m(e){let{components:t,...a}=e;return(0,r.yg)(u,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.6/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.6/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata: \n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Split them into different gitrepos, or use\n",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.6/troubleshooting"},"here"),".")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0db4760e.f9dde841.js b/assets/js/0db4760e.f9dde841.js new file mode 100644 index 000000000..e0fd55a76 --- /dev/null +++ b/assets/js/0db4760e.f9dde841.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2811],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>y});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),l=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=l(a),g=r,y=u["".concat(p,".").concat(g)]||u[g]||m[g]||i;return a?n.createElement(y,o(o({ref:t},c),{},{components:a})):n.createElement(y,o({ref:t},c))}));function y(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=g;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var l=2;l{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var n=a(8168),r=(a(6540),a(5680));const i={},o="Create a GitRepo Resource",s={unversionedId:"gitrepo-add",id:"version-0.6/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.6/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.6/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/gitrepo-add.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.6/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.6/gitrepo-targets"}},p={},l=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2}],c={toc:l},u="wrapper";function m(e){let{components:t,...a}=e;return(0,r.yg)(u,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.6/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.6/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata: \n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Split them into different gitrepos, or use\n",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.6/troubleshooting"},"here"),".")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e3fdb5a.46d42090.js b/assets/js/0e3fdb5a.46d42090.js new file mode 100644 index 000000000..556b98ed4 --- /dev/null +++ b/assets/js/0e3fdb5a.46d42090.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3561],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.9/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.9/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.9/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/gitrepo-add.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.9/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.9/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],d={toc:s},c="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.9/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.9/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.9/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.9/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.9/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.9/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e3fdb5a.8a3be9fd.js b/assets/js/0e3fdb5a.8a3be9fd.js deleted file mode 100644 index 8e968a2c6..000000000 --- a/assets/js/0e3fdb5a.8a3be9fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3561],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.9/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.9/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.9/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/gitrepo-add.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.9/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.9/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],d={toc:s},c="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.9/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.9/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.9/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.9/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.9/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.9/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e50cd4d.7f27c46a.js b/assets/js/0e50cd4d.8175ca19.js similarity index 68% rename from assets/js/0e50cd4d.7f27c46a.js rename to assets/js/0e50cd4d.8175ca19.js index 864bc6af1..24f280ec9 100644 --- a/assets/js/0e50cd4d.7f27c46a.js +++ b/assets/js/0e50cd4d.8175ca19.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9612],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),d=a,g=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?n.createElement(g,s(s({ref:t},i),{},{components:r})):n.createElement(g,s({ref:t},i))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.5/cluster-group",title:"Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.5/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.5/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-group.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Manager Initiated",permalink:"/0.5/manager-initiated"},next:{title:"Namespaces",permalink:"/0.5/namespaces"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-groups"},"Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9612],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),d=a,g=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?n.createElement(g,s(s({ref:t},i),{},{components:r})):n.createElement(g,s({ref:t},i))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.5/cluster-group",title:"Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.5/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.5/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-group.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Manager Initiated",permalink:"/0.5/manager-initiated"},next:{title:"Namespaces",permalink:"/0.5/namespaces"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-groups"},"Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0f38f188.58ab694b.js b/assets/js/0f38f188.58ab694b.js deleted file mode 100644 index 1a69aac42..000000000 --- a/assets/js/0f38f188.58ab694b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4195],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.7/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.7/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.7/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/webhook.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.7/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.7/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/0f38f188.9b4ae222.js b/assets/js/0f38f188.9b4ae222.js new file mode 100644 index 000000000..24422a87a --- /dev/null +++ b/assets/js/0f38f188.9b4ae222.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4195],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.7/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.7/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.7/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/webhook.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.7/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.7/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/10f03480.16f3129f.js b/assets/js/10f03480.16f3129f.js new file mode 100644 index 000000000..8b28ec1bb --- /dev/null +++ b/assets/js/10f03480.16f3129f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8351],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>y});var l=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=l.createContext({}),p=function(e){var t=l.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return l.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,y=m["".concat(s,".").concat(d)]||m[d]||u[d]||r;return n?l.createElement(y,o(o({ref:t},c),{},{components:n})):l.createElement(y,o({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var l=n(8168),a=(n(6540),n(5680));const r={},o="Examples",i={unversionedId:"examples",id:"version-0.4/examples",title:"Examples",description:"Lifecycle of a Fleet Bundle",source:"@site/versioned_docs/version-0.4/examples.md",sourceDirName:".",slug:"/examples",permalink:"/0.4/examples",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/examples.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.4/architecture"},next:{title:"Overview",permalink:"/0.4/cluster-overview"}},s={},p=[{value:"Lifecycle of a Fleet Bundle",id:"lifecycle-of-a-fleet-bundle",level:3},{value:"Deploy Kubernetes Manifests Across Clusters with Customization",id:"deploy-kubernetes-manifests-across-clusters-with-customization",level:3},{value:"Additional Examples",id:"additional-examples",level:3}],c={toc:p},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(m,(0,l.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"examples"},"Examples"),(0,a.yg)("h3",{id:"lifecycle-of-a-fleet-bundle"},"Lifecycle of a Fleet Bundle"),(0,a.yg)("p",null,"To demonstrate the lifecycle of a Fleet bundle, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"User will create a ",(0,a.yg)("a",{parentName:"li",href:"/0.4/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,a.yg)("a",{parentName:"li",href:"/0.4/webhook"},"webhook event"),". With every commit change, the ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,a.yg)("a",{parentName:"li",href:"/0.4/cluster-bundles-state#bundles"},"bundle"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,a.yg)("ol",{start:3},(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,a.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,a.yg)("h3",{id:"deploy-kubernetes-manifests-across-clusters-with-customization"},"Deploy Kubernetes Manifests Across Clusters with Customization"),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,a.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters using Fleet, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml")," as a case study."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,a.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,a.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,a.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Expected behavior:")," "),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,a.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,a.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,a.yg)("li",{parentName:"ol"},"Under ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,a.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),": ")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Result:")),(0,a.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,a.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,a.yg)("h3",{id:"additional-examples"},"Additional Examples"),(0,a.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/10f03480.e81d66d6.js b/assets/js/10f03480.e81d66d6.js deleted file mode 100644 index d7359858e..000000000 --- a/assets/js/10f03480.e81d66d6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8351],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>y});var l=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=l.createContext({}),p=function(e){var t=l.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return l.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,y=m["".concat(s,".").concat(d)]||m[d]||u[d]||r;return n?l.createElement(y,o(o({ref:t},c),{},{components:n})):l.createElement(y,o({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var l=n(8168),a=(n(6540),n(5680));const r={},o="Examples",i={unversionedId:"examples",id:"version-0.4/examples",title:"Examples",description:"Lifecycle of a Fleet Bundle",source:"@site/versioned_docs/version-0.4/examples.md",sourceDirName:".",slug:"/examples",permalink:"/0.4/examples",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/examples.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.4/architecture"},next:{title:"Overview",permalink:"/0.4/cluster-overview"}},s={},p=[{value:"Lifecycle of a Fleet Bundle",id:"lifecycle-of-a-fleet-bundle",level:3},{value:"Deploy Kubernetes Manifests Across Clusters with Customization",id:"deploy-kubernetes-manifests-across-clusters-with-customization",level:3},{value:"Additional Examples",id:"additional-examples",level:3}],c={toc:p},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(m,(0,l.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"examples"},"Examples"),(0,a.yg)("h3",{id:"lifecycle-of-a-fleet-bundle"},"Lifecycle of a Fleet Bundle"),(0,a.yg)("p",null,"To demonstrate the lifecycle of a Fleet bundle, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"User will create a ",(0,a.yg)("a",{parentName:"li",href:"/0.4/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,a.yg)("a",{parentName:"li",href:"/0.4/webhook"},"webhook event"),". With every commit change, the ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,a.yg)("a",{parentName:"li",href:"/0.4/cluster-bundles-state#bundles"},"bundle"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,a.yg)("ol",{start:3},(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,a.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,a.yg)("h3",{id:"deploy-kubernetes-manifests-across-clusters-with-customization"},"Deploy Kubernetes Manifests Across Clusters with Customization"),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,a.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters using Fleet, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml")," as a case study."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,a.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,a.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,a.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Expected behavior:")," "),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,a.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,a.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,a.yg)("li",{parentName:"ol"},"Under ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,a.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),": ")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Result:")),(0,a.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,a.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,a.yg)("h3",{id:"additional-examples"},"Additional Examples"),(0,a.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/11f54a6a.946c3aa6.js b/assets/js/11f54a6a.946c3aa6.js deleted file mode 100644 index f6cf3ef60..000000000 --- a/assets/js/11f54a6a.946c3aa6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8172],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),d=r,g=u["".concat(l,".").concat(d)]||u[d]||m[d]||i;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const i={},o="Adding a GitRepo",s={unversionedId:"gitrepo-add",id:"version-0.5/gitrepo-add",title:"Adding a GitRepo",description:"Proper namespace",source:"@site/versioned_docs/version-0.5/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.5/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/gitrepo-add.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.5/namespaces"},next:{title:"Expected Repo Structure",permalink:"/0.5/gitrepo-structure"}},l={},p=[{value:"Proper namespace",id:"proper-namespace",level:2},{value:"Create GitRepo instance",id:"create-gitrepo-instance",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2}],c={toc:p},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"adding-a-gitrepo"},"Adding a GitRepo"),(0,r.yg)("h2",{id:"proper-namespace"},"Proper namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo instance"),(0,r.yg)("p",null,"Git repositories are register by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," following the below YAML sample. Refer\nto the inline comments as the means of each field"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n')),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",null,"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.5/troubleshooting"},"here"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/34a3c1ae.3cc5a4ec.js b/assets/js/11f54a6a.d83cc3de.js similarity index 92% rename from assets/js/34a3c1ae.3cc5a4ec.js rename to assets/js/11f54a6a.d83cc3de.js index 631f39f33..eeadfc9c6 100644 --- a/assets/js/34a3c1ae.3cc5a4ec.js +++ b/assets/js/11f54a6a.d83cc3de.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7484],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),d=r,g=u["".concat(l,".").concat(d)]||u[d]||m[d]||i;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const i={},o="Adding a GitRepo",s={unversionedId:"gitrepo-add",id:"version-0.4/gitrepo-add",title:"Adding a GitRepo",description:"Proper namespace",source:"@site/versioned_docs/version-0.4/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.4/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/gitrepo-add.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.4/namespaces"},next:{title:"Expected Repo Structure",permalink:"/0.4/gitrepo-structure"}},l={},p=[{value:"Proper namespace",id:"proper-namespace",level:2},{value:"Create GitRepo instance",id:"create-gitrepo-instance",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2}],c={toc:p},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"adding-a-gitrepo"},"Adding a GitRepo"),(0,r.yg)("h2",{id:"proper-namespace"},"Proper namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo instance"),(0,r.yg)("p",null,"Git repositories are register by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," following the below YAML sample. Refer\nto the inline comments as the means of each field"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n')),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",null,"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.4/troubleshooting"},"here"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8172],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),d=r,g=u["".concat(l,".").concat(d)]||u[d]||m[d]||i;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const i={},o="Adding a GitRepo",s={unversionedId:"gitrepo-add",id:"version-0.5/gitrepo-add",title:"Adding a GitRepo",description:"Proper namespace",source:"@site/versioned_docs/version-0.5/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.5/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/gitrepo-add.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.5/namespaces"},next:{title:"Expected Repo Structure",permalink:"/0.5/gitrepo-structure"}},l={},p=[{value:"Proper namespace",id:"proper-namespace",level:2},{value:"Create GitRepo instance",id:"create-gitrepo-instance",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2}],c={toc:p},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"adding-a-gitrepo"},"Adding a GitRepo"),(0,r.yg)("h2",{id:"proper-namespace"},"Proper namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo instance"),(0,r.yg)("p",null,"Git repositories are register by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," following the below YAML sample. Refer\nto the inline comments as the means of each field"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n')),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",null,"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.5/troubleshooting"},"here"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/126a9cd0.de97e80e.js b/assets/js/126a9cd0.de97e80e.js new file mode 100644 index 000000000..8f147c744 --- /dev/null +++ b/assets/js/126a9cd0.de97e80e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4269],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return r?n.createElement(m,s(s({ref:t},g),{},{components:r})):n.createElement(m,s({ref:t},g))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,s=new Array(i);s[0]=d;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,s[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},s="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"version-0.9/ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/versioned_docs/version-0.9/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.9/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-registration.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.9/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.9/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:4},{value:"Cluster -> ClusterRegistrationToken + Import Account",id:"cluster---clusterregistrationtoken--import-account",level:4},{value:"Fleet-Agent -> ClusterRegistration",id:"fleet-agent---clusterregistration",level:4},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Process",id:"process",level:3},{value:"Secrets",id:"secrets",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...i}=e;return(0,a.yg)(u,(0,n.A)({},g,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h4",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handlded by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"For manager initiated registration the process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h4",{id:"cluster---clusterregistrationtoken--import-account"},"Cluster -> ClusterRegistrationToken + Import Account"),(0,a.yg)("p",null,"Now that a cluster resource exists, ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and runs ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," to create the fleet-agent deployment.\u2028",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," also creates a ",(0,a.yg)("a",{parentName:"p",href:"/0.9/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"clusterregistrationtoken"))," and waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistationtoken")," triggers the creation of the import service account, which can create ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system").\nThe ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," will enqueue itself until the import service account exists, because that\u2019s needed to create the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret.\nNow, the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," and the bootstrap secret are present on the downstream cluster"),(0,a.yg)("h4",{id:"fleet-agent---clusterregistration"},"Fleet-Agent -> ClusterRegistration"),(0,a.yg)("p",null,"Immediately the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret (which contains the import kubeconfig) and starts registering if present. Then ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," creates a clusterregistration resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret\u2019s name."),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and tries to grant the clusterregistration request to create ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent"),"\u2019s serviceaccount and create the ",(0,a.yg)("inlineCode",{parentName:"p"},"\u2018c-*\u2019")," registration secret with the clients new kubeconfig.\nThe registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),'. The new kubeconfig uses the "request" account. The request account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"bundledeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"contents"),"."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},"The fleet-default namespace has all the cluster registrations, the import account uses a separate namespace."),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster/namespace change and call manageagent to create a bundle. The agent will update itself to the bundle and since the generation env var changes it will restart."),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"process"},"Process"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.9/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.9/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets"},"Secrets"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"}}]); \ No newline at end of file diff --git a/assets/js/12f4838b.3083aa03.js b/assets/js/12f4838b.599de7ad.js similarity index 50% rename from assets/js/12f4838b.3083aa03.js rename to assets/js/12f4838b.599de7ad.js index b9d642f02..b1697926b 100644 --- a/assets/js/12f4838b.3083aa03.js +++ b/assets/js/12f4838b.599de7ad.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5153],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},g=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return n?r.createElement(m,o(o({ref:t},g),{},{components:n})):r.createElement(m,o({ref:t},g))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:a,o[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const i={},o="Manager Initiated",c={unversionedId:"manager-initiated",id:"version-0.5/manager-initiated",title:"Manager Initiated",description:"Refer to the overview page for a background information on the manager initiated registration style.",source:"@site/versioned_docs/version-0.5/manager-initiated.md",sourceDirName:".",slug:"/manager-initiated",permalink:"/0.5/manager-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/manager-initiated.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Agent Initiated",permalink:"/0.5/agent-initiated"},next:{title:"Cluster Groups",permalink:"/0.5/cluster-group"}},l={},s=[{value:"Kubeconfig Secret",id:"kubeconfig-secret",level:2},{value:"Example",id:"example",level:2},{value:"Kubeconfig Secret",id:"kubeconfig-secret-1",level:3},{value:"Cluster",id:"cluster",level:3}],g={toc:s},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"manager-initiated"},"Manager Initiated"),(0,a.yg)("p",null,"Refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the manager initiated registration style."),(0,a.yg)("h2",{id:"kubeconfig-secret"},"Kubeconfig Secret"),(0,a.yg)("p",null,"The manager initiated registration flow is accomplished by creating a\n",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,a.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,a.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,a.yg)("p",null,"The format of this secret is intended to match the ",(0,a.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format"),"\nof the kubeconfig\nsecret used in ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically\nregistered with Fleet."),(0,a.yg)("h2",{id:"example"},"Example"),(0,a.yg)("h3",{id:"kubeconfig-secret-1"},"Kubeconfig Secret"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,a.yg)("h3",{id:"cluster"},"Cluster"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5153],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},g=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return n?r.createElement(m,o(o({ref:t},g),{},{components:n})):r.createElement(m,o({ref:t},g))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:a,o[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const i={},o="Manager Initiated",c={unversionedId:"manager-initiated",id:"version-0.5/manager-initiated",title:"Manager Initiated",description:"Refer to the overview page for a background information on the manager initiated registration style.",source:"@site/versioned_docs/version-0.5/manager-initiated.md",sourceDirName:".",slug:"/manager-initiated",permalink:"/0.5/manager-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/manager-initiated.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Agent Initiated",permalink:"/0.5/agent-initiated"},next:{title:"Cluster Groups",permalink:"/0.5/cluster-group"}},l={},s=[{value:"Kubeconfig Secret",id:"kubeconfig-secret",level:2},{value:"Example",id:"example",level:2},{value:"Kubeconfig Secret",id:"kubeconfig-secret-1",level:3},{value:"Cluster",id:"cluster",level:3}],g={toc:s},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"manager-initiated"},"Manager Initiated"),(0,a.yg)("p",null,"Refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the manager initiated registration style."),(0,a.yg)("h2",{id:"kubeconfig-secret"},"Kubeconfig Secret"),(0,a.yg)("p",null,"The manager initiated registration flow is accomplished by creating a\n",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,a.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,a.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,a.yg)("p",null,"The format of this secret is intended to match the ",(0,a.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format"),"\nof the kubeconfig\nsecret used in ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically\nregistered with Fleet."),(0,a.yg)("h2",{id:"example"},"Example"),(0,a.yg)("h3",{id:"kubeconfig-secret-1"},"Kubeconfig Secret"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,a.yg)("h3",{id:"cluster"},"Cluster"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/140acae8.2926f0f1.js b/assets/js/140acae8.2926f0f1.js new file mode 100644 index 000000000..bc6947a7d --- /dev/null +++ b/assets/js/140acae8.2926f0f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9042],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:r,l[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(8168),r=(n(6540),n(5680));const o={},l="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.7/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.7/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.7/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-fleet-yaml.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.7/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.7/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,r.yg)("p",null,"For more information on how to use the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,r.yg)("a",{parentName:"p",href:"/0.7/gitrepo-content"},"Git Repository Contents"),"."),(0,r.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),", which contains the ",(0,r.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. Note, if the functions output changes with every\n # call, e.g. `uuidv4`, the bundle will get redeployed.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name.\n clusterName: dev-cluster\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources\n# makes the Bundle to be in an error state when it shouldn\'t.\nignore:\n # Conditions to be ignored\n conditions:\n # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/140acae8.bcf5605b.js b/assets/js/140acae8.bcf5605b.js deleted file mode 100644 index c5d0da5c6..000000000 --- a/assets/js/140acae8.bcf5605b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9042],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:r,l[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(8168),r=(n(6540),n(5680));const o={},l="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.7/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.7/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.7/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-fleet-yaml.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.7/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.7/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,r.yg)("p",null,"For more information on how to use the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,r.yg)("a",{parentName:"p",href:"/0.7/gitrepo-content"},"Git Repository Contents"),"."),(0,r.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),", which contains the ",(0,r.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. Note, if the functions output changes with every\n # call, e.g. `uuidv4`, the bundle will get redeployed.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name.\n clusterName: dev-cluster\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources\n# makes the Bundle to be in an error state when it shouldn\'t.\nignore:\n # Conditions to be ignored\n conditions:\n # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/14d1d990.15ff1d72.js b/assets/js/14d1d990.6136153b.js similarity index 62% rename from assets/js/14d1d990.15ff1d72.js rename to assets/js/14d1d990.6136153b.js index 7256e4532..921e3cac3 100644 --- a/assets/js/14d1d990.15ff1d72.js +++ b/assets/js/14d1d990.6136153b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2891],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},f),{},{components:r})):n.createElement(g,a({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet test"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.10/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.10/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_test.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet target",permalink:"/0.10/cli/fleet-cli/fleet_target"},next:{title:"fleetcontroller",permalink:"/0.10/cli/fleet-controller/fleetcontroller"}},c={},s=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output (deprecated)"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2891],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},f),{},{components:r})):n.createElement(g,a({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet test"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.10/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.10/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_test.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet target",permalink:"/0.10/cli/fleet-cli/fleet_target"},next:{title:"fleetcontroller",permalink:"/0.10/cli/fleet-controller/fleetcontroller"}},c={},s=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output (deprecated)"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/157d7e96.190215b4.js b/assets/js/157d7e96.190215b4.js new file mode 100644 index 000000000..dd1d75703 --- /dev/null +++ b/assets/js/157d7e96.190215b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1285],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},4918:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.10/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.10/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.10/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/tut-deployment.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.10/quickstart"},next:{title:"Uninstall",permalink:"/0.10/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},4918:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.10/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.10/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.10/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/tut-deployment.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.10/quickstart"},next:{title:"Uninstall",permalink:"/0.10/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{n.d(t,{xA:()=>p,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,m=f["".concat(s,".").concat(d)]||f[d]||u[d]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.8/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.8/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.8/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.8/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.8/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -h, --help help for apply\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/167e2e0a.e7f44ca9.js b/assets/js/167e2e0a.e7f44ca9.js deleted file mode 100644 index d29f81c4d..000000000 --- a/assets/js/167e2e0a.e7f44ca9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8068],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,m=f["".concat(s,".").concat(d)]||f[d]||u[d]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.8/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.8/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.8/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.8/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.8/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -h, --help help for apply\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/170989a3.398c8cf3.js b/assets/js/170989a3.398c8cf3.js new file mode 100644 index 000000000..2c7c97e08 --- /dev/null +++ b/assets/js/170989a3.398c8cf3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9995],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.6/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.6/index.md",sourceDirName:".",slug:"/",permalink:"/0.6/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/index.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.6/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file diff --git a/assets/js/18f4f7da.6b1d35eb.js b/assets/js/18f4f7da.6b1d35eb.js new file mode 100644 index 000000000..6d0d91c80 --- /dev/null +++ b/assets/js/18f4f7da.6b1d35eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7034],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=o,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return n?a.createElement(f,r(r({ref:t},c),{},{components:n})):a.createElement(f,r({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,r=new Array(l);r[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>s,toc:()=>u});var a=n(8168),o=(n(6540),n(5680));const l={},r="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.9/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.9/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.9/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-fleet-yaml.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.9/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.9/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,o.yg)("p",null,"For more information on how to use the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,o.yg)("a",{parentName:"p",href:"/0.9/gitrepo-content"},"Git Repository Contents"),"."),(0,o.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),", which contains the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,o.yg)("h3",{id:"reference"},"Reference"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by Fleet.\nnamespaceLabels:\n key: value\n# namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n ### These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n\n ### These options only work for helm-type bundles\n #\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. Note, if the functions output changes with every\n # call, e.g. `uuidv4`, the bundle will get redeployed.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # Disable DNS resolution in Helm\'s template functions\n disableDNS: false\n # Skip evaluation of the values.schema.json file\n skipSchemaValidation: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.\n clusterName: dev-cluster\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # Resources will not be deployed in the matched clusters if doNotDeploy is true.\n doNotDeploy: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources\n# makes the Bundle to be in an error state when it shouldn\'t.\nignore:\n # Conditions to be ignored\n conditions:\n # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/18f4f7da.f4776356.js b/assets/js/18f4f7da.f4776356.js deleted file mode 100644 index e34a6ee01..000000000 --- a/assets/js/18f4f7da.f4776356.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7034],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=o,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return n?a.createElement(f,r(r({ref:t},c),{},{components:n})):a.createElement(f,r({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,r=new Array(l);r[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>s,toc:()=>u});var a=n(8168),o=(n(6540),n(5680));const l={},r="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.9/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.9/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.9/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-fleet-yaml.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.9/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.9/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,o.yg)("p",null,"For more information on how to use the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,o.yg)("a",{parentName:"p",href:"/0.9/gitrepo-content"},"Git Repository Contents"),"."),(0,o.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),", which contains the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,o.yg)("h3",{id:"reference"},"Reference"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by Fleet.\nnamespaceLabels:\n key: value\n# namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n ### These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n\n ### These options only work for helm-type bundles\n #\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. Note, if the functions output changes with every\n # call, e.g. `uuidv4`, the bundle will get redeployed.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # Disable DNS resolution in Helm\'s template functions\n disableDNS: false\n # Skip evaluation of the values.schema.json file\n skipSchemaValidation: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.\n clusterName: dev-cluster\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # Resources will not be deployed in the matched clusters if doNotDeploy is true.\n doNotDeploy: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources\n# makes the Bundle to be in an error state when it shouldn\'t.\nignore:\n # Conditions to be ignored\n conditions:\n # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1a00f7b1.ee7115b0.js b/assets/js/1a00f7b1.ee7115b0.js new file mode 100644 index 000000000..01391d678 --- /dev/null +++ b/assets/js/1a00f7b1.ee7115b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7291],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.10/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.10/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.10/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/namespaces.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.10/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/0.10/resources-during-deployment"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.10/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.10/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("p",null,"The cluster registration namespace contains the cluster and the clusterregistration resources, as well as any gitrepos and bundles."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/1a00f7b1.eee72c3a.js b/assets/js/1a00f7b1.eee72c3a.js deleted file mode 100644 index da0c863fd..000000000 --- a/assets/js/1a00f7b1.eee72c3a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7291],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.10/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.10/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.10/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/namespaces.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.10/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/0.10/resources-during-deployment"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.10/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.10/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("p",null,"The cluster registration namespace contains the cluster and the clusterregistration resources, as well as any gitrepos and bundles."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/1bd61b9d.25179d07.js b/assets/js/1bd61b9d.25179d07.js deleted file mode 100644 index 6183c0770..000000000 --- a/assets/js/1bd61b9d.25179d07.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[446],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.6/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.6/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.6/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/bundle-diffs.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.6/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.6/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec. "),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")," "),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/1bd61b9d.bf7f7775.js b/assets/js/1bd61b9d.bf7f7775.js new file mode 100644 index 000000000..5b962a0f9 --- /dev/null +++ b/assets/js/1bd61b9d.bf7f7775.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[446],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.6/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.6/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.6/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/bundle-diffs.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.6/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.6/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec. "),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")," "),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/1cb1b893.4ff3da0a.js b/assets/js/1cb1b893.35738093.js similarity index 84% rename from assets/js/1cb1b893.4ff3da0a.js rename to assets/js/1cb1b893.35738093.js index 18dc269a1..922ea1d02 100644 --- a/assets/js/1cb1b893.4ff3da0a.js +++ b/assets/js/1cb1b893.35738093.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[166],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>d});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(n),f=o,d=u["".concat(i,".").concat(f)]||u[f]||g[f]||a;return n?r.createElement(d,c(c({ref:t},p),{},{components:n})):r.createElement(d,c({ref:t},p))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,c=new Array(a);c[0]=f;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>g,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(8168),o=(n(6540),n(5680));const a={title:"Next \ud83d\udea7"},c=void 0,l={unversionedId:"changelogs/changelogs/next",id:"changelogs/changelogs/next",title:"Next \ud83d\udea7",description:"We are still working on the next release.",source:"@site/docs/changelogs/changelogs/next.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/next",permalink:"/changelogs/changelogs/next",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/changelogs/changelogs/next.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"Next \ud83d\udea7"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/troubleshooting"},next:{title:"How to enable experimental features",permalink:"/enableexperimental"}},i={},s=[],p={toc:s},u="wrapper";function g(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"We are still working on the next release."))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[166],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>d});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=r.createContext({}),s=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(n),f=o,d=u["".concat(i,".").concat(f)]||u[f]||g[f]||a;return n?r.createElement(d,c(c({ref:t},p),{},{components:n})):r.createElement(d,c({ref:t},p))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,c=new Array(a);c[0]=f;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>g,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(8168),o=(n(6540),n(5680));const a={title:"Next \ud83d\udea7"},c=void 0,l={unversionedId:"changelogs/changelogs/next",id:"changelogs/changelogs/next",title:"Next \ud83d\udea7",description:"We are still working on the next release.",source:"@site/docs/changelogs/changelogs/next.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/next",permalink:"/changelogs/changelogs/next",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/changelogs/changelogs/next.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"Next \ud83d\udea7"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/troubleshooting"},next:{title:"How to enable experimental features",permalink:"/enableexperimental"}},i={},s=[],p={toc:s},u="wrapper";function g(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"We are still working on the next release."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1e7260bb.d8ec397a.js b/assets/js/1e7260bb.bd148c1e.js similarity index 56% rename from assets/js/1e7260bb.d8ec397a.js rename to assets/js/1e7260bb.bd148c1e.js index c0045a626..fed2eaadc 100644 --- a/assets/js/1e7260bb.d8ec397a.js +++ b/assets/js/1e7260bb.bd148c1e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9792],{5680:(e,t,r)=>{r.d(t,{xA:()=>c,yg:()=>m});var n=r(6540);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var u=n.createContext({}),a=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=a(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,o=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=a(r),y=s,m=p["".concat(u,".").concat(y)]||p[y]||d[y]||o;return r?n.createElement(m,i(i({ref:t},c),{},{components:r})):n.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var o=r.length,i=new Array(o);i[0]=y;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:s,i[1]=l;for(var a=2;a{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>a});var n=r(8168),s=(r(6540),r(5680));const o={},i="Resources List",l={unversionedId:"resource-counts-and-resources-list",id:"version-0.10/resource-counts-and-resources-list",title:"Resources List",description:"This document outlines the deployed resources, categorized under Bundles and GitRepos.",source:"@site/versioned_docs/version-0.10/resource-counts-and-resources-list.md",sourceDirName:".",slug:"/resource-counts-and-resources-list",permalink:"/0.10/resource-counts-and-resources-list",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/resource-counts-and-resources-list.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.10/cluster-bundles-state"},next:{title:"Cluster Registration Internals",permalink:"/0.10/ref-registration"}},u={},a=[{value:"Bundles",id:"bundles",level:2},{value:"GitRepos",id:"gitrepos",level:2},{value:"GitRepos",id:"gitrepos-1",level:2},{value:"Clusters",id:"clusters",level:2},{value:"ClusterGroups",id:"clustergroups",level:2}],c={toc:a},p="wrapper";function d(e){let{components:t,...r}=e;return(0,s.yg)(p,(0,n.A)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"resources-list"},"Resources List"),(0,s.yg)("p",null,"This document outlines the deployed resources, categorized under ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"."),(0,s.yg)("h2",{id:"bundles"},"Bundles"),(0,s.yg)("p",null,"The deployed resources within bundles can be found in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceKey"),". This key represents the actual resources deployed via ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h2",{id:"gitrepos"},"GitRepos"),(0,s.yg)("p",null,"Similar to bundles, the deployed resources in ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are listed in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.Resources"),". This list is also derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),". "),(0,s.yg)("h1",{id:"resource-counts"},"Resource Counts"),(0,s.yg)("h2",{id:"gitrepos-1"},"GitRepos"),(0,s.yg)("p",null,"The ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list for GitRepos is derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h2",{id:"clusters"},"Clusters"),(0,s.yg)("p",null,"In Clusters, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is derived from GitRepos."),(0,s.yg)("h2",{id:"clustergroups"},"ClusterGroups"),(0,s.yg)("p",null,"In ClusterGroups, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is also derived from GitRepos."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9792],{5680:(e,t,r)=>{r.d(t,{xA:()=>c,yg:()=>m});var n=r(6540);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var u=n.createContext({}),a=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=a(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,o=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=a(r),y=s,m=p["".concat(u,".").concat(y)]||p[y]||d[y]||o;return r?n.createElement(m,i(i({ref:t},c),{},{components:r})):n.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var o=r.length,i=new Array(o);i[0]=y;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:s,i[1]=l;for(var a=2;a{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>a});var n=r(8168),s=(r(6540),r(5680));const o={},i="Resources List",l={unversionedId:"resource-counts-and-resources-list",id:"version-0.10/resource-counts-and-resources-list",title:"Resources List",description:"This document outlines the deployed resources, categorized under Bundles and GitRepos.",source:"@site/versioned_docs/version-0.10/resource-counts-and-resources-list.md",sourceDirName:".",slug:"/resource-counts-and-resources-list",permalink:"/0.10/resource-counts-and-resources-list",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/resource-counts-and-resources-list.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.10/cluster-bundles-state"},next:{title:"Cluster Registration Internals",permalink:"/0.10/ref-registration"}},u={},a=[{value:"Bundles",id:"bundles",level:2},{value:"GitRepos",id:"gitrepos",level:2},{value:"GitRepos",id:"gitrepos-1",level:2},{value:"Clusters",id:"clusters",level:2},{value:"ClusterGroups",id:"clustergroups",level:2}],c={toc:a},p="wrapper";function d(e){let{components:t,...r}=e;return(0,s.yg)(p,(0,n.A)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"resources-list"},"Resources List"),(0,s.yg)("p",null,"This document outlines the deployed resources, categorized under ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"."),(0,s.yg)("h2",{id:"bundles"},"Bundles"),(0,s.yg)("p",null,"The deployed resources within bundles can be found in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceKey"),". This key represents the actual resources deployed via ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h2",{id:"gitrepos"},"GitRepos"),(0,s.yg)("p",null,"Similar to bundles, the deployed resources in ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are listed in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.Resources"),". This list is also derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),". "),(0,s.yg)("h1",{id:"resource-counts"},"Resource Counts"),(0,s.yg)("h2",{id:"gitrepos-1"},"GitRepos"),(0,s.yg)("p",null,"The ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list for GitRepos is derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h2",{id:"clusters"},"Clusters"),(0,s.yg)("p",null,"In Clusters, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is derived from GitRepos."),(0,s.yg)("h2",{id:"clustergroups"},"ClusterGroups"),(0,s.yg)("p",null,"In ClusterGroups, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is also derived from GitRepos."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1f14308a.2cfdbadd.js b/assets/js/1f14308a.2cfdbadd.js deleted file mode 100644 index 707d8020c..000000000 --- a/assets/js/1f14308a.2cfdbadd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9769],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Image scan",s={unversionedId:"imagescan",id:"version-0.5/imagescan",title:"Image scan",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.5/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.5/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/imagescan.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Webhook",permalink:"/0.5/webhook"},next:{title:"Cluster and Bundle state",permalink:"/0.5/cluster-bundles-state"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"image-scan"},"Image scan"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order \n- policy: \n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver: \n range: "*" \n # can use ascending or descending order\n alphabetical:\n order: asc \n\n # specify images to scan\n image: "your.registry.com/repo/image" \n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret \n\n # Specify the scan interval\n interval: 5m \n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples \n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m \n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret \n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1f14308a.bb5d5a3a.js b/assets/js/1f14308a.bb5d5a3a.js new file mode 100644 index 000000000..d84573617 --- /dev/null +++ b/assets/js/1f14308a.bb5d5a3a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9769],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Image scan",s={unversionedId:"imagescan",id:"version-0.5/imagescan",title:"Image scan",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.5/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.5/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/imagescan.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Webhook",permalink:"/0.5/webhook"},next:{title:"Cluster and Bundle state",permalink:"/0.5/cluster-bundles-state"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"image-scan"},"Image scan"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order \n- policy: \n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver: \n range: "*" \n # can use ascending or descending order\n alphabetical:\n order: asc \n\n # specify images to scan\n image: "your.registry.com/repo/image" \n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret \n\n # Specify the scan interval\n interval: 5m \n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples \n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m \n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret \n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8307bb82.e7c3a6cb.js b/assets/js/1f330703.18b38c65.js similarity index 83% rename from assets/js/8307bb82.e7c3a6cb.js rename to assets/js/1f330703.18b38c65.js index 6530522e1..087ead16c 100644 --- a/assets/js/8307bb82.e7c3a6cb.js +++ b/assets/js/1f330703.18b38c65.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7161],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.6/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.6/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.6/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/architecture.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.6/uninstall"},next:{title:"Core Concepts",permalink:"/0.6/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.6/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5320],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.8/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.8/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.8/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/architecture.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.8/uninstall"},next:{title:"Core Concepts",permalink:"/0.8/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/1f330703.bc1898dd.js b/assets/js/1f330703.bc1898dd.js deleted file mode 100644 index edf222415..000000000 --- a/assets/js/1f330703.bc1898dd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5320],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.8/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.8/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.8/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/architecture.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.8/uninstall"},next:{title:"Core Concepts",permalink:"/0.8/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/1f8b8b7b.429da043.js b/assets/js/1f8b8b7b.f8b991ed.js similarity index 73% rename from assets/js/1f8b8b7b.429da043.js rename to assets/js/1f8b8b7b.f8b991ed.js index 63a2291e1..991da5749 100644 --- a/assets/js/1f8b8b7b.429da043.js +++ b/assets/js/1f8b8b7b.f8b991ed.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9777],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.8/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.8/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.8/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/uninstall.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.8/tut-deployment"},next:{title:"Architecture",permalink:"/0.8/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9777],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.8/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.8/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.8/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/uninstall.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.8/tut-deployment"},next:{title:"Architecture",permalink:"/0.8/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1fec2b35.19b5f491.js b/assets/js/1fec2b35.19b5f491.js deleted file mode 100644 index a82b51d16..000000000 --- a/assets/js/1fec2b35.19b5f491.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9313],{5680:(e,t,n)=>{n.d(t,{xA:()=>i,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),d=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},i=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),p=d(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},i),{},{components:n})):r.createElement(g,s({ref:t},i))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle state",o={unversionedId:"cluster-bundles-state",id:"version-0.4/cluster-bundles-state",title:"Cluster and Bundle state",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.4/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.4/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-bundles-state.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Image scan",permalink:"/0.4/imagescan"},next:{title:"Troubleshooting",permalink:"/0.4/troubleshooting"}},u={},d=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],i={toc:d},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1fec2b35.26022808.js b/assets/js/1fec2b35.26022808.js new file mode 100644 index 000000000..acbb92e48 --- /dev/null +++ b/assets/js/1fec2b35.26022808.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9313],{5680:(e,t,n)=>{n.d(t,{xA:()=>i,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),d=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},i=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),p=d(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},i),{},{components:n})):r.createElement(g,s({ref:t},i))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle state",o={unversionedId:"cluster-bundles-state",id:"version-0.4/cluster-bundles-state",title:"Cluster and Bundle state",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.4/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.4/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-bundles-state.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Image scan",permalink:"/0.4/imagescan"},next:{title:"Troubleshooting",permalink:"/0.4/troubleshooting"}},u={},d=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],i={toc:d},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/20889235.98aa2648.js b/assets/js/20889235.47188a9e.js similarity index 67% rename from assets/js/20889235.98aa2648.js rename to assets/js/20889235.47188a9e.js index c785d2b66..1609a01b8 100644 --- a/assets/js/20889235.98aa2648.js +++ b/assets/js/20889235.47188a9e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[356],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.7/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.7/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.7/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cluster-group.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.7/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.7/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[356],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.7/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.7/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.7/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cluster-group.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.7/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.7/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/21d02ecb.56c6e1d1.js b/assets/js/21d02ecb.56c6e1d1.js deleted file mode 100644 index b10ae7ac9..000000000 --- a/assets/js/21d02ecb.56c6e1d1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9044],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return r?n.createElement(m,s(s({ref:t},g),{},{components:r})):n.createElement(m,s({ref:t},g))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,s=new Array(i);s[0]=d;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,s[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},s="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"version-0.8/ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/versioned_docs/version-0.8/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.8/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-registration.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.8/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.8/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:4},{value:"Cluster -> ClusterRegistrationToken + Import Account",id:"cluster---clusterregistrationtoken--import-account",level:4},{value:"Fleet-Agent -> ClusterRegistration",id:"fleet-agent---clusterregistration",level:4},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Process",id:"process",level:3},{value:"Secrets",id:"secrets",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...i}=e;return(0,a.yg)(u,(0,n.A)({},g,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h4",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handlded by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"For manager initiated registration the process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h4",{id:"cluster---clusterregistrationtoken--import-account"},"Cluster -> ClusterRegistrationToken + Import Account"),(0,a.yg)("p",null,"Now that a cluster resource exists, ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and runs ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," to create the fleet-agent deployment.\u2028",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," also creates a ",(0,a.yg)("a",{parentName:"p",href:"/0.8/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"clusterregistrationtoken"))," and waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistationtoken")," triggers the creation of the import service account, which can create ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system").\nThe ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," will enqueue itself until the import service account exists, because that\u2019s needed to create the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret.\nNow, the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," and the bootstrap secret are present on the downstream cluster"),(0,a.yg)("h4",{id:"fleet-agent---clusterregistration"},"Fleet-Agent -> ClusterRegistration"),(0,a.yg)("p",null,"Immediately the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret (which contains the import kubeconfig) and starts registering if present. Then ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," creates a clusterregistration resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret\u2019s name."),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and tries to grant the clusterregistration request to create ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent"),"\u2019s serviceaccount and create the ",(0,a.yg)("inlineCode",{parentName:"p"},"\u2018c-*\u2019")," registration secret with the clients new kubeconfig.\nThe registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),'. The new kubeconfig uses the "request" account. The request account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"bundledeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"contents"),"."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},"The fleet-default namespace has all the cluster registrations, the import account uses a separate namespace."),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster/namespace change and call manageagent to create a bundle. The agent will update itself to the bundle and since the generation env var changes it will restart."),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"process"},"Process"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.8/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.8/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets"},"Secrets"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"}}]); \ No newline at end of file diff --git a/assets/js/126a9cd0.25e10f3a.js b/assets/js/21d02ecb.69b6ee31.js similarity index 86% rename from assets/js/126a9cd0.25e10f3a.js rename to assets/js/21d02ecb.69b6ee31.js index c650406e1..6273a408f 100644 --- a/assets/js/126a9cd0.25e10f3a.js +++ b/assets/js/21d02ecb.69b6ee31.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4269],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return r?n.createElement(m,s(s({ref:t},g),{},{components:r})):n.createElement(m,s({ref:t},g))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,s=new Array(i);s[0]=d;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,s[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},s="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"version-0.9/ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/versioned_docs/version-0.9/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.9/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-registration.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.9/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.9/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:4},{value:"Cluster -> ClusterRegistrationToken + Import Account",id:"cluster---clusterregistrationtoken--import-account",level:4},{value:"Fleet-Agent -> ClusterRegistration",id:"fleet-agent---clusterregistration",level:4},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Process",id:"process",level:3},{value:"Secrets",id:"secrets",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...i}=e;return(0,a.yg)(u,(0,n.A)({},g,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h4",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handlded by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"For manager initiated registration the process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h4",{id:"cluster---clusterregistrationtoken--import-account"},"Cluster -> ClusterRegistrationToken + Import Account"),(0,a.yg)("p",null,"Now that a cluster resource exists, ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and runs ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," to create the fleet-agent deployment.\u2028",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," also creates a ",(0,a.yg)("a",{parentName:"p",href:"/0.9/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"clusterregistrationtoken"))," and waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistationtoken")," triggers the creation of the import service account, which can create ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system").\nThe ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," will enqueue itself until the import service account exists, because that\u2019s needed to create the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret.\nNow, the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," and the bootstrap secret are present on the downstream cluster"),(0,a.yg)("h4",{id:"fleet-agent---clusterregistration"},"Fleet-Agent -> ClusterRegistration"),(0,a.yg)("p",null,"Immediately the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret (which contains the import kubeconfig) and starts registering if present. Then ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," creates a clusterregistration resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret\u2019s name."),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and tries to grant the clusterregistration request to create ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent"),"\u2019s serviceaccount and create the ",(0,a.yg)("inlineCode",{parentName:"p"},"\u2018c-*\u2019")," registration secret with the clients new kubeconfig.\nThe registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),'. The new kubeconfig uses the "request" account. The request account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"bundledeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"contents"),"."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},"The fleet-default namespace has all the cluster registrations, the import account uses a separate namespace."),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster/namespace change and call manageagent to create a bundle. The agent will update itself to the bundle and since the generation env var changes it will restart."),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"process"},"Process"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.9/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.9/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets"},"Secrets"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9044],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return r?n.createElement(m,s(s({ref:t},g),{},{components:r})):n.createElement(m,s({ref:t},g))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,s=new Array(i);s[0]=d;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,s[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},s="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"version-0.8/ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/versioned_docs/version-0.8/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.8/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-registration.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.8/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.8/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:4},{value:"Cluster -> ClusterRegistrationToken + Import Account",id:"cluster---clusterregistrationtoken--import-account",level:4},{value:"Fleet-Agent -> ClusterRegistration",id:"fleet-agent---clusterregistration",level:4},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Process",id:"process",level:3},{value:"Secrets",id:"secrets",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...i}=e;return(0,a.yg)(u,(0,n.A)({},g,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/0.8/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h4",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handlded by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"For manager initiated registration the process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h4",{id:"cluster---clusterregistrationtoken--import-account"},"Cluster -> ClusterRegistrationToken + Import Account"),(0,a.yg)("p",null,"Now that a cluster resource exists, ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and runs ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," to create the fleet-agent deployment.\u2028",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," also creates a ",(0,a.yg)("a",{parentName:"p",href:"/0.8/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"clusterregistrationtoken"))," and waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistationtoken")," triggers the creation of the import service account, which can create ",(0,a.yg)("inlineCode",{parentName:"p"},"clusterregistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system").\nThe ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," will enqueue itself until the import service account exists, because that\u2019s needed to create the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret.\nNow, the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," and the bootstrap secret are present on the downstream cluster"),(0,a.yg)("h4",{id:"fleet-agent---clusterregistration"},"Fleet-Agent -> ClusterRegistration"),(0,a.yg)("p",null,"Immediately the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret (which contains the import kubeconfig) and starts registering if present. Then ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," creates a clusterregistration resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret\u2019s name."),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," triggers and tries to grant the clusterregistration request to create ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent"),"\u2019s serviceaccount and create the ",(0,a.yg)("inlineCode",{parentName:"p"},"\u2018c-*\u2019")," registration secret with the clients new kubeconfig.\nThe registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),'. The new kubeconfig uses the "request" account. The request account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"bundledeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"contents"),"."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},"The fleet-default namespace has all the cluster registrations, the import account uses a separate namespace."),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster/namespace change and call manageagent to create a bundle. The agent will update itself to the bundle and since the generation env var changes it will restart."),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"process"},"Process"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.8/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.8/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets"},"Secrets"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"}}]); \ No newline at end of file diff --git a/assets/js/22b369d5.10a66fd1.js b/assets/js/22b369d5.472193c7.js similarity index 76% rename from assets/js/22b369d5.10a66fd1.js rename to assets/js/22b369d5.472193c7.js index ebb8d8b37..9294bc612 100644 --- a/assets/js/22b369d5.10a66fd1.js +++ b/assets/js/22b369d5.472193c7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8164],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=l,d=p["".concat(s,".").concat(m)]||p[m]||f[m]||a;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.4/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.4/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.4/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/uninstall.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Multi-cluster Install",permalink:"/0.4/multi-cluster-install"},next:{title:"Fleet v0.4.0",permalink:"/0.4/changelogs/changelogs/v0.4.0"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8164],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=l,d=p["".concat(s,".").concat(m)]||p[m]||f[m]||a;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.4/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.4/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.4/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/uninstall.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Multi-cluster Install",permalink:"/0.4/multi-cluster-install"},next:{title:"Fleet v0.4.0",permalink:"/0.4/changelogs/changelogs/v0.4.0"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/235236aa.128b6fd9.js b/assets/js/235236aa.38aa7f81.js similarity index 64% rename from assets/js/235236aa.128b6fd9.js rename to assets/js/235236aa.38aa7f81.js index 7bbc39bc1..941c312bf 100644 --- a/assets/js/235236aa.128b6fd9.js +++ b/assets/js/235236aa.38aa7f81.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5958],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>m});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},f=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,f=a(e,["components","mdxType","originalType","parentName"]),u=p(r),d=l,m=u["".concat(i,".").concat(d)]||u[d]||s[d]||o;return r?n.createElement(m,c(c({ref:t},f),{},{components:r})):n.createElement(m,c({ref:t},f))}));function m(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,c=new Array(o);c[0]=d;var a={};for(var i in t)hasOwnProperty.call(t,i)&&(a[i]=t[i]);a.originalType=e,a[u]="string"==typeof e?e:l,c[1]=a;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>s,frontMatter:()=>o,metadata:()=>a,toc:()=>p});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller cleanup"},c=void 0,a={unversionedId:"cli/fleet-controller/fleetcontroller_cleanup",id:"cli/fleet-controller/fleetcontroller_cleanup",title:"",description:"fleetcontroller cleanup",source:"@site/docs/cli/fleet-controller/fleetcontroller_cleanup.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_cleanup",permalink:"/cli/fleet-controller/fleetcontroller_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller_cleanup.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller cleanup"},sidebar:"docs",previous:{title:"fleetcontroller agentmanagement",permalink:"/cli/fleet-controller/fleetcontroller_agentmanagement"},next:{title:"fleetcontroller gitjob",permalink:"/cli/fleet-controller/fleetcontroller_gitjob"}},i={},p=[{value:"fleetcontroller cleanup",id:"fleetcontroller-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},u="wrapper";function s(e){let{components:t,...r}=e;return(0,l.yg)(u,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-cleanup"},"fleetcontroller cleanup"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller cleanup [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -h, --help help for cleanup\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5958],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>m});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},f=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,f=a(e,["components","mdxType","originalType","parentName"]),u=p(r),d=l,m=u["".concat(i,".").concat(d)]||u[d]||s[d]||o;return r?n.createElement(m,c(c({ref:t},f),{},{components:r})):n.createElement(m,c({ref:t},f))}));function m(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,c=new Array(o);c[0]=d;var a={};for(var i in t)hasOwnProperty.call(t,i)&&(a[i]=t[i]);a.originalType=e,a[u]="string"==typeof e?e:l,c[1]=a;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>s,frontMatter:()=>o,metadata:()=>a,toc:()=>p});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller cleanup"},c=void 0,a={unversionedId:"cli/fleet-controller/fleetcontroller_cleanup",id:"cli/fleet-controller/fleetcontroller_cleanup",title:"",description:"fleetcontroller cleanup",source:"@site/docs/cli/fleet-controller/fleetcontroller_cleanup.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_cleanup",permalink:"/cli/fleet-controller/fleetcontroller_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller_cleanup.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller cleanup"},sidebar:"docs",previous:{title:"fleetcontroller agentmanagement",permalink:"/cli/fleet-controller/fleetcontroller_agentmanagement"},next:{title:"fleetcontroller gitjob",permalink:"/cli/fleet-controller/fleetcontroller_gitjob"}},i={},p=[{value:"fleetcontroller cleanup",id:"fleetcontroller-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},u="wrapper";function s(e){let{components:t,...r}=e;return(0,l.yg)(u,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-cleanup"},"fleetcontroller cleanup"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller cleanup [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -h, --help help for cleanup\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/246340c6.10b9fcc4.js b/assets/js/246340c6.10b9fcc4.js new file mode 100644 index 000000000..848100225 --- /dev/null +++ b/assets/js/246340c6.10b9fcc4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5223],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),p=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),m=r,g=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},o="Mapping to Downstream Clusters",s={unversionedId:"gitrepo-targets",id:"version-0.6/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.6/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.6/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/gitrepo-targets.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.6/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.6/bundle-diffs"}},i={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Additional Examples",id:"additional-examples",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters. "),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")," "),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),": ")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("admonition",{title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will deploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed etcd's\nconfigured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details.")),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/246340c6.e60e56de.js b/assets/js/246340c6.e60e56de.js deleted file mode 100644 index 6f9c99a7f..000000000 --- a/assets/js/246340c6.e60e56de.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5223],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),p=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),m=r,g=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},o="Mapping to Downstream Clusters",s={unversionedId:"gitrepo-targets",id:"version-0.6/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.6/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.6/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/gitrepo-targets.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.6/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.6/bundle-diffs"}},i={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Additional Examples",id:"additional-examples",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters. "),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")," "),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),": ")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("admonition",{title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will deploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed etcd's\nconfigured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details.")),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/24a8fd1b.0bf966a3.js b/assets/js/24a8fd1b.0bf966a3.js deleted file mode 100644 index 4c00c2ca5..000000000 --- a/assets/js/24a8fd1b.0bf966a3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1529],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),c=p(a),u=l,h=c["".concat(s,".").concat(u)]||c[u]||m[u]||n;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:l,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var r=a(8168),l=(a(6540),a(5680));const n={title:"Fleet v0.4.1",date:"2022-11-18 13:27:55 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.4.1",id:"version-0.4/changelogs/changelogs/v0.4.1",title:"Fleet v0.4.1",description:"(rancherio-gh-m) released this 2022-11-18 1355 +0000 UTC",source:"@site/versioned_docs/version-0.4/changelogs/changelogs/v0.4.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.4.1",permalink:"/0.4/changelogs/changelogs/v0.4.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/changelogs/changelogs/v0.4.1.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"Fleet v0.4.1",date:"2022-11-18 13:27:55 +0000 UTC"},sidebar:"docs",previous:{title:"Fleet v0.4.0",permalink:"/0.4/changelogs/changelogs/v0.4.0"}},s={},p=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:p},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.yg)(c,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2022-11-18 13:27:55 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Bug Fixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix parameter generation when using Helm secrets in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1451303982","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1098","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1098/hovercard",href:"https://github.com/rancher/fleet/pull/1098"},"#1098")),(0,l.yg)("li",null,"Fix token expiry bug by in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1451556578","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1099","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1099/hovercard",href:"https://github.com/rancher/fleet/pull/1099"},"#1099"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.4.0...v0.4.1"},(0,l.yg)("tt",null,"v0.4.0...v0.4.1"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz"},"fleet-crd-0.4.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-agent-0.4.1.tgz"},"fleet-agent-0.4.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz"},"fleet-0.4.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.4.1"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/24a8fd1b.62a25a58.js b/assets/js/24a8fd1b.62a25a58.js new file mode 100644 index 000000000..0d8be0c4e --- /dev/null +++ b/assets/js/24a8fd1b.62a25a58.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1529],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),c=p(a),u=l,h=c["".concat(s,".").concat(u)]||c[u]||m[u]||n;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:l,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var r=a(8168),l=(a(6540),a(5680));const n={title:"Fleet v0.4.1",date:"2022-11-18 13:27:55 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.4.1",id:"version-0.4/changelogs/changelogs/v0.4.1",title:"Fleet v0.4.1",description:"(rancherio-gh-m) released this 2022-11-18 1355 +0000 UTC",source:"@site/versioned_docs/version-0.4/changelogs/changelogs/v0.4.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.4.1",permalink:"/0.4/changelogs/changelogs/v0.4.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/changelogs/changelogs/v0.4.1.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"Fleet v0.4.1",date:"2022-11-18 13:27:55 +0000 UTC"},sidebar:"docs",previous:{title:"Fleet v0.4.0",permalink:"/0.4/changelogs/changelogs/v0.4.0"}},s={},p=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:p},c="wrapper";function m(e){let{components:t,...a}=e;return(0,l.yg)(c,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2022-11-18 13:27:55 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Bug Fixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix parameter generation when using Helm secrets in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1451303982","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1098","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1098/hovercard",href:"https://github.com/rancher/fleet/pull/1098"},"#1098")),(0,l.yg)("li",null,"Fix token expiry bug by in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1451556578","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1099","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1099/hovercard",href:"https://github.com/rancher/fleet/pull/1099"},"#1099"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.4.0...v0.4.1"},(0,l.yg)("tt",null,"v0.4.0...v0.4.1"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz"},"fleet-crd-0.4.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-agent-0.4.1.tgz"},"fleet-agent-0.4.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz"},"fleet-0.4.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.4.1"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/250ffcdd.4494df9e.js b/assets/js/250ffcdd.4494df9e.js deleted file mode 100644 index 5f5699a49..000000000 --- a/assets/js/250ffcdd.4494df9e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2343],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.8/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.8/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.8/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/troubleshooting.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.8/ref-bundle"},next:{title:"v0.8.0",permalink:"/0.8/changelogs/changelogs/v0.8.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,a.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.8/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/250ffcdd.be2361d9.js b/assets/js/250ffcdd.be2361d9.js new file mode 100644 index 000000000..66365a155 --- /dev/null +++ b/assets/js/250ffcdd.be2361d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2343],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.8/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.8/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.8/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/troubleshooting.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.8/ref-bundle"},next:{title:"v0.8.0",permalink:"/0.8/changelogs/changelogs/v0.8.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,a.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.8/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2579085f.99b330b2.js b/assets/js/2579085f.99b330b2.js new file mode 100644 index 000000000..abe326dc2 --- /dev/null +++ b/assets/js/2579085f.99b330b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8805],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},9713:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.8/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.8/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.8/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/tut-deployment.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.8/quickstart"},next:{title:"Uninstall",permalink:"/0.8/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.8/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},9713:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.8/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.8/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.8/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/tut-deployment.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.8/quickstart"},next:{title:"Uninstall",permalink:"/0.8/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.8/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.10/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.10/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.10/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/gitrepo-targets.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.10/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.10/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/28ebbdc0.8ede376f.js b/assets/js/28ebbdc0.8ede376f.js deleted file mode 100644 index 9f49b0a91..000000000 --- a/assets/js/28ebbdc0.8ede376f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[627],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.10/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.10/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.10/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/gitrepo-targets.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.10/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.10/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2938f7a2.da4aa6ed.js b/assets/js/2938f7a2.9b1f1da5.js similarity index 62% rename from assets/js/2938f7a2.da4aa6ed.js rename to assets/js/2938f7a2.9b1f1da5.js index 1ee0701a2..c1804bc6e 100644 --- a/assets/js/2938f7a2.da4aa6ed.js +++ b/assets/js/2938f7a2.9b1f1da5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5725],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=a,g=p["".concat(l,".").concat(d)]||p[d]||f[d]||i;return r?n.createElement(g,o(o({ref:t},u),{},{components:r})):n.createElement(g,o({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},o="Cluster Registration Internals",s={unversionedId:"ref-registration",id:"version-0.7/ref-registration",title:"Cluster Registration Internals",description:"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.",source:"@site/versioned_docs/version-0.7/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.7/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-registration.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.7/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.7/ref-configuration"}},l={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...i}=e;return(0,a.yg)(p,(0,n.A)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.7/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.7/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})))}f.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5725],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=a,g=p["".concat(l,".").concat(d)]||p[d]||f[d]||i;return r?n.createElement(g,o(o({ref:t},u),{},{components:r})):n.createElement(g,o({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},o="Cluster Registration Internals",s={unversionedId:"ref-registration",id:"version-0.7/ref-registration",title:"Cluster Registration Internals",description:"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.",source:"@site/versioned_docs/version-0.7/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.7/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-registration.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.7/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.7/ref-configuration"}},l={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...i}=e;return(0,a.yg)(p,(0,n.A)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.7/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.7/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})))}f.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"}}]); \ No newline at end of file diff --git a/assets/js/2a9b5780.2ce9ef51.js b/assets/js/2a9b5780.2ce9ef51.js new file mode 100644 index 000000000..c46a3f508 --- /dev/null +++ b/assets/js/2a9b5780.2ce9ef51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2601],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,y=d["".concat(s,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(y,o(o({ref:t},p),{},{components:n})):a.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.9/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.9/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.9/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/bundle-add.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.9/imagescan"},next:{title:"fleet-agent",permalink:"/0.9/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2a9b5780.8c8bf1e5.js b/assets/js/2a9b5780.8c8bf1e5.js deleted file mode 100644 index aa95a65bb..000000000 --- a/assets/js/2a9b5780.8c8bf1e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2601],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,y=d["".concat(s,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(y,o(o({ref:t},p),{},{components:n})):a.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.9/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.9/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.9/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/bundle-add.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.9/imagescan"},next:{title:"fleet-agent",permalink:"/0.9/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2ab8e7e7.ff254f93.js b/assets/js/2ab8e7e7.bb86e1ce.js similarity index 50% rename from assets/js/2ab8e7e7.ff254f93.js rename to assets/js/2ab8e7e7.bb86e1ce.js index 85814b39e..5c8c6ce86 100644 --- a/assets/js/2ab8e7e7.ff254f93.js +++ b/assets/js/2ab8e7e7.bb86e1ce.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2298],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,d=c["".concat(s,".").concat(m)]||c[m]||g[m]||l;return n?a.createElement(d,i(i({ref:t},u),{},{components:n})):a.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>g,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},i="How to enable experimental features",o={unversionedId:"enableexperimental",id:"enableexperimental",title:"How to enable experimental features",description:"Fleet supports experimental features that are disabled by default and that can be enabled by the user.",source:"@site/docs/enableexperimental.md",sourceDirName:".",slug:"/enableexperimental",permalink:"/enableexperimental",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/enableexperimental.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Next \ud83d\udea7",permalink:"/changelogs/changelogs/next"},next:{title:"OCI Storage",permalink:"/oci-storage"}},s={},p=[{value:"Enabling an experimental feature",id:"enabling-an-experimental-feature",level:2},{value:"Enabling when installing Fleet stand-alone",id:"enabling-when-installing-fleet-stand-alone",level:3},{value:"Enabling when installing Fleet with Rancher",id:"enabling-when-installing-fleet-with-rancher",level:3},{value:"Available experimental features",id:"available-experimental-features",level:2}],u={toc:p},c="wrapper";function g(e){let{components:t,...n}=e;return(0,r.yg)(c,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"how-to-enable-experimental-features"},"How to enable experimental features"),(0,r.yg)("p",null,"Fleet supports experimental features that are disabled by default and that can be enabled by the user."),(0,r.yg)("p",null,"Enabling/disabling experimental features is done using extra environment variables that are available when deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"rancher/fleet"),"."),(0,r.yg)("h2",{id:"enabling-an-experimental-feature"},"Enabling an experimental feature"),(0,r.yg)("p",null,"At the moment we're writing this document, Fleet has OCI storage as an experimental feature."),(0,r.yg)("h3",{id:"enabling-when-installing-fleet-stand-alone"},"Enabling when installing Fleet stand-alone"),(0,r.yg)("p",null,"All you need to do is to pass something like:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"--set-string extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \\\n--set-string extraEnv[0].value=true \\\n")),(0,r.yg)("p",null,"to your helm install or update command. "),(0,r.yg)("p",null,"Please note you have to use ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string")," because otherwise the boolean value won't work as expected."),(0,r.yg)("h3",{id:"enabling-when-installing-fleet-with-rancher"},"Enabling when installing Fleet with Rancher"),(0,r.yg)("p",null,"You can also activate the experimental features in Fleet when installing Rancher."),(0,r.yg)("p",null,"The parameters are the same, but you have to add the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.")," prefix."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"--set-string fleet.extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \\\n--set-string fleet.extraEnv[0].value=true \\\n")),(0,r.yg)("h2",{id:"available-experimental-features"},"Available experimental features"),(0,r.yg)("p",null,"Right now Fleet supports the following experimental features:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/oci-storage"},(0,r.yg)("inlineCode",{parentName:"a"},"EXPERIMENTAL_OCI_STORAGE")))))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2298],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,d=c["".concat(s,".").concat(m)]||c[m]||g[m]||l;return n?a.createElement(d,i(i({ref:t},u),{},{components:n})):a.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>g,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},i="How to enable experimental features",o={unversionedId:"enableexperimental",id:"enableexperimental",title:"How to enable experimental features",description:"Fleet supports experimental features that are disabled by default and that can be enabled by the user.",source:"@site/docs/enableexperimental.md",sourceDirName:".",slug:"/enableexperimental",permalink:"/enableexperimental",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/enableexperimental.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Next \ud83d\udea7",permalink:"/changelogs/changelogs/next"},next:{title:"OCI Storage",permalink:"/oci-storage"}},s={},p=[{value:"Enabling an experimental feature",id:"enabling-an-experimental-feature",level:2},{value:"Enabling when installing Fleet stand-alone",id:"enabling-when-installing-fleet-stand-alone",level:3},{value:"Enabling when installing Fleet with Rancher",id:"enabling-when-installing-fleet-with-rancher",level:3},{value:"Available experimental features",id:"available-experimental-features",level:2}],u={toc:p},c="wrapper";function g(e){let{components:t,...n}=e;return(0,r.yg)(c,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"how-to-enable-experimental-features"},"How to enable experimental features"),(0,r.yg)("p",null,"Fleet supports experimental features that are disabled by default and that can be enabled by the user."),(0,r.yg)("p",null,"Enabling/disabling experimental features is done using extra environment variables that are available when deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"rancher/fleet"),"."),(0,r.yg)("h2",{id:"enabling-an-experimental-feature"},"Enabling an experimental feature"),(0,r.yg)("p",null,"At the moment we're writing this document, Fleet has OCI storage as an experimental feature."),(0,r.yg)("h3",{id:"enabling-when-installing-fleet-stand-alone"},"Enabling when installing Fleet stand-alone"),(0,r.yg)("p",null,"All you need to do is to pass something like:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"--set-string extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \\\n--set-string extraEnv[0].value=true \\\n")),(0,r.yg)("p",null,"to your helm install or update command. "),(0,r.yg)("p",null,"Please note you have to use ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string")," because otherwise the boolean value won't work as expected."),(0,r.yg)("h3",{id:"enabling-when-installing-fleet-with-rancher"},"Enabling when installing Fleet with Rancher"),(0,r.yg)("p",null,"You can also activate the experimental features in Fleet when installing Rancher."),(0,r.yg)("p",null,"The parameters are the same, but you have to add the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.")," prefix."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"--set-string fleet.extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \\\n--set-string fleet.extraEnv[0].value=true \\\n")),(0,r.yg)("h2",{id:"available-experimental-features"},"Available experimental features"),(0,r.yg)("p",null,"Right now Fleet supports the following experimental features:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/oci-storage"},(0,r.yg)("inlineCode",{parentName:"a"},"EXPERIMENTAL_OCI_STORAGE")))))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2ad17f29.1f2a4882.js b/assets/js/2ad17f29.028c104a.js similarity index 67% rename from assets/js/2ad17f29.1f2a4882.js rename to assets/js/2ad17f29.028c104a.js index 31c358f62..b8117997d 100644 --- a/assets/js/2ad17f29.1f2a4882.js +++ b/assets/js/2ad17f29.028c104a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5901],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),f=c(r),u=l,d=f["".concat(s,".").concat(u)]||f[u]||p[u]||a;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,i=new Array(a);i[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[f]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-agent register"},i=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_register",id:"version-0.10/cli/fleet-agent/fleet-agent_register",title:"",description:"fleet-agent register",source:"@site/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_register.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_register",permalink:"/0.10/cli/fleet-agent/fleet-agent_register",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_register.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent register"},sidebar:"docs",previous:{title:"fleet-agent clusterstatus",permalink:"/0.10/cli/fleet-agent/fleet-agent_clusterstatus"},next:{title:"fleet",permalink:"/0.10/cli/fleet-cli/fleet"}},s={},c=[{value:"fleet-agent register",id:"fleet-agent-register",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],g={toc:c},f="wrapper";function p(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},g,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-register"},"fleet-agent register"),(0,l.yg)("p",null,"Register agent with an upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent register [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for register\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5901],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),f=c(r),u=l,d=f["".concat(s,".").concat(u)]||f[u]||p[u]||a;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,i=new Array(a);i[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[f]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-agent register"},i=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_register",id:"version-0.10/cli/fleet-agent/fleet-agent_register",title:"",description:"fleet-agent register",source:"@site/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_register.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_register",permalink:"/0.10/cli/fleet-agent/fleet-agent_register",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_register.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent register"},sidebar:"docs",previous:{title:"fleet-agent clusterstatus",permalink:"/0.10/cli/fleet-agent/fleet-agent_clusterstatus"},next:{title:"fleet",permalink:"/0.10/cli/fleet-cli/fleet"}},s={},c=[{value:"fleet-agent register",id:"fleet-agent-register",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],g={toc:c},f="wrapper";function p(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},g,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-register"},"fleet-agent register"),(0,l.yg)("p",null,"Register agent with an upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent register [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for register\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a0e6d91.8fadd991.js b/assets/js/2c86db16.2c2ff5aa.js similarity index 53% rename from assets/js/3a0e6d91.8fadd991.js rename to assets/js/2c86db16.2c2ff5aa.js index 5b16e8fef..feff9f8de 100644 --- a/assets/js/3a0e6d91.8fadd991.js +++ b/assets/js/2c86db16.2c2ff5aa.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9242],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.9/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.9/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.9/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-bundle.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.9/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.9/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.9/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[871],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.7/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.7/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.7/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-bundle.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.7/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.7/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.7/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2c86db16.62d00473.js b/assets/js/2c86db16.62d00473.js deleted file mode 100644 index c9832cc1e..000000000 --- a/assets/js/2c86db16.62d00473.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[871],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.7/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.7/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.7/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-bundle.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.7/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.7/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.7/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f7cf1511.26fdaa67.js b/assets/js/2d618eff.39ae4d3d.js similarity index 85% rename from assets/js/f7cf1511.26fdaa67.js rename to assets/js/2d618eff.39ae4d3d.js index 5562bc040..b34c3c3be 100644 --- a/assets/js/f7cf1511.26fdaa67.js +++ b/assets/js/2d618eff.39ae4d3d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7637],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=a,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.5/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.5/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.5/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/troubleshooting.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle state",permalink:"/0.5/cluster-bundles-state"},next:{title:"Advanced Users",permalink:"/0.5/advanced-users"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled. "),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo. "),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu "),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown "),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.5/gitrepo-structure"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority" \n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm: \n releaseName: \n repo: \n chart: \ndiff: \n comparePatches: \n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations" \n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/bundle-diffs"},"bundle diffs documentation")," for more information. ")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}h.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[883],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=a,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.4/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.4/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.4/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/troubleshooting.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle state",permalink:"/0.4/cluster-bundles-state"},next:{title:"Advanced Users",permalink:"/0.4/advanced-users"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled. "),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo. "),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu "),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown "),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.4/gitrepo-structure"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority" \n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm: \n releaseName: \n repo: \n chart: \ndiff: \n comparePatches: \n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations" \n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/bundle-diffs"},"bundle diffs documentation")," for more information. ")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2d618eff.e9d40b63.js b/assets/js/2d618eff.e9d40b63.js deleted file mode 100644 index 7817d2471..000000000 --- a/assets/js/2d618eff.e9d40b63.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[883],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=a,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.4/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.4/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.4/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/troubleshooting.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle state",permalink:"/0.4/cluster-bundles-state"},next:{title:"Advanced Users",permalink:"/0.4/advanced-users"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled. "),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo. "),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu "),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown "),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.4/gitrepo-structure"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority" \n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm: \n releaseName: \n repo: \n chart: \ndiff: \n comparePatches: \n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations" \n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/bundle-diffs"},"bundle diffs documentation")," for more information. ")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2dc49bc9.4463ba25.js b/assets/js/2dc49bc9.ec9c2283.js similarity index 54% rename from assets/js/2dc49bc9.4463ba25.js rename to assets/js/2dc49bc9.ec9c2283.js index 6cc6157ac..785d010d1 100644 --- a/assets/js/2dc49bc9.4463ba25.js +++ b/assets/js/2dc49bc9.ec9c2283.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8106],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.6/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.6/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.6/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-cli/fleet_test.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.6/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.6/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8106],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.6/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.6/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.6/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-cli/fleet_test.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.6/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.6/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/300dc0ad.25368bb2.js b/assets/js/300dc0ad.25368bb2.js deleted file mode 100644 index 89311d19a..000000000 --- a/assets/js/300dc0ad.25368bb2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1292],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),g=c(n),f=l,m=g["".concat(s,".").concat(f)]||g[f]||p[f]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[g]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.9/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.9/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.9/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-configuration.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.9/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/0.9/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},g="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(g,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/300dc0ad.3556dca1.js b/assets/js/300dc0ad.3556dca1.js new file mode 100644 index 000000000..48619b65f --- /dev/null +++ b/assets/js/300dc0ad.3556dca1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1292],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),g=c(n),f=l,m=g["".concat(s,".").concat(f)]||g[f]||p[f]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[g]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.9/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.9/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.9/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-configuration.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.9/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/0.9/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},g="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(g,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/32a14031.e5603202.js b/assets/js/32a14031.e5603202.js new file mode 100644 index 000000000..39a56979b --- /dev/null +++ b/assets/js/32a14031.e5603202.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2722],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.8/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.8/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.8/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-gitrepo.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.8/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.8/ref-bundle"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n #\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default. \n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating \n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/32c7bf40.61ccaeda.js b/assets/js/32c7bf40.61ccaeda.js new file mode 100644 index 000000000..5535f003f --- /dev/null +++ b/assets/js/32c7bf40.61ccaeda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3898],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:r,l[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(8168),r=(n(6540),n(5680));const o={},l="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.6/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.6/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.6/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-fleet-yaml.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.6/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.6/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,r.yg)("p",null,"For more information on how to use the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,r.yg)("a",{parentName:"p",href:"/0.6/gitrepo-content"},"Git Repository Contents"),"."),(0,r.yg)("p",null,"The content of the fleet.yaml corresponds to ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/bundlereader/read.go#L129-L135"},"https://github.com/rancher/fleet/blob/main/pkg/bundlereader/read.go#L129-L135"),", which contains the ",(0,r.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# Optional map of labels, that are set at the bundle and can be used in a \n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. However, the `uuidv4` function is not supported.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default \n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n \n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector: \n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. \n clusterName: dev-cluster \n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/32c7bf40.8631f097.js b/assets/js/32c7bf40.8631f097.js deleted file mode 100644 index 64cd7d1d0..000000000 --- a/assets/js/32c7bf40.8631f097.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3898],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=r,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:r,l[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(8168),r=(n(6540),n(5680));const o={},l="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.6/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.6/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.6/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-fleet-yaml.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.6/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.6/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,r.yg)("p",null,"For more information on how to use the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,r.yg)("a",{parentName:"p",href:"/0.6/gitrepo-content"},"Git Repository Contents"),"."),(0,r.yg)("p",null,"The content of the fleet.yaml corresponds to ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/bundlereader/read.go#L129-L135"},"https://github.com/rancher/fleet/blob/main/pkg/bundlereader/read.go#L129-L135"),", which contains the ",(0,r.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# Optional map of labels, that are set at the bundle and can be used in a \n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. However, the `uuidv4` function is not supported.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default \n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n \n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector: \n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. \n clusterName: dev-cluster \n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/340d0560.9f543b39.js b/assets/js/340d0560.97702eb6.js similarity index 51% rename from assets/js/340d0560.9f543b39.js rename to assets/js/340d0560.97702eb6.js index 0c2fc7f79..4bdd05065 100644 --- a/assets/js/340d0560.9f543b39.js +++ b/assets/js/340d0560.97702eb6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3441],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),f=s(n),p=a,d=f["".concat(c,".").concat(p)]||f[p]||g[p]||l;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=p;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/docs/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-agent/fleet-agent.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/bundle-add"},next:{title:"fleet-agent clusterstatus",permalink:"/cli/fleet-agent/fleet-agent_clusterstatus"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:s},f="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,a.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_clusterstatus"},"fleet-agent clusterstatus"),"\t - Continuously report resource status to the upstream cluster"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_register"},"fleet-agent register"),"\t - Register agent with an upstream cluster")))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3441],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),f=s(n),p=a,d=f["".concat(c,".").concat(p)]||f[p]||g[p]||l;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=p;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/docs/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-agent/fleet-agent.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/bundle-add"},next:{title:"fleet-agent clusterstatus",permalink:"/cli/fleet-agent/fleet-agent_clusterstatus"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:s},f="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,a.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_clusterstatus"},"fleet-agent clusterstatus"),"\t - Continuously report resource status to the upstream cluster"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_register"},"fleet-agent register"),"\t - Register agent with an upstream cluster")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/34a3c1ae.545ec266.js b/assets/js/34a3c1ae.545ec266.js new file mode 100644 index 000000000..4120d8857 --- /dev/null +++ b/assets/js/34a3c1ae.545ec266.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7484],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),d=r,g=u["".concat(l,".").concat(d)]||u[d]||m[d]||i;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const i={},o="Adding a GitRepo",s={unversionedId:"gitrepo-add",id:"version-0.4/gitrepo-add",title:"Adding a GitRepo",description:"Proper namespace",source:"@site/versioned_docs/version-0.4/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.4/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/gitrepo-add.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.4/namespaces"},next:{title:"Expected Repo Structure",permalink:"/0.4/gitrepo-structure"}},l={},p=[{value:"Proper namespace",id:"proper-namespace",level:2},{value:"Create GitRepo instance",id:"create-gitrepo-instance",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2}],c={toc:p},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"adding-a-gitrepo"},"Adding a GitRepo"),(0,r.yg)("h2",{id:"proper-namespace"},"Proper namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.4/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo instance"),(0,r.yg)("p",null,"Git repositories are register by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," following the below YAML sample. Refer\nto the inline comments as the means of each field"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n')),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. As a workaround, split them into different gitrepos.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",null,"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.4/troubleshooting"},"here"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/34c1e1e7.26e36456.js b/assets/js/34c1e1e7.26e36456.js new file mode 100644 index 000000000..c7895d2ee --- /dev/null +++ b/assets/js/34c1e1e7.26e36456.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2832],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),g=c(n),f=l,m=g["".concat(s,".").concat(f)]||g[f]||p[f]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[g]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.8/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.8/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.8/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-configuration.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.8/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/0.8/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},g="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(g,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/34c1e1e7.2da037ef.js b/assets/js/34c1e1e7.2da037ef.js deleted file mode 100644 index e3f70fe2c..000000000 --- a/assets/js/34c1e1e7.2da037ef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2832],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),g=c(n),f=l,m=g["".concat(s,".").concat(f)]||g[f]||p[f]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[g]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.8/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.8/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.8/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-configuration.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.8/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/0.8/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},g="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(g,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e0636556.e3f1aea1.js b/assets/js/34eb4307.3097c176.js similarity index 83% rename from assets/js/e0636556.e3f1aea1.js rename to assets/js/34eb4307.3097c176.js index 324e5e93f..237eed358 100644 --- a/assets/js/e0636556.e3f1aea1.js +++ b/assets/js/34eb4307.3097c176.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8047],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.5/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.5/index.md",sourceDirName:".",slug:"/",permalink:"/0.5/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/index.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.5/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5311],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.4/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.4/index.md",sourceDirName:".",slug:"/",permalink:"/0.4/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/index.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.4/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/34eb4307.dd0cd695.js b/assets/js/34eb4307.dd0cd695.js deleted file mode 100644 index 67caf7baa..000000000 --- a/assets/js/34eb4307.dd0cd695.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5311],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.4/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.4/index.md",sourceDirName:".",slug:"/",permalink:"/0.4/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/index.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.4/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/370ac30b.2c6f0742.js b/assets/js/370ac30b.2c6f0742.js deleted file mode 100644 index 305f4a3de..000000000 --- a/assets/js/370ac30b.2c6f0742.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9204],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.9/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.9/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.9/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/multi-user.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.9/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.9/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.9/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.9/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/370ac30b.c1f02bf9.js b/assets/js/370ac30b.c1f02bf9.js new file mode 100644 index 000000000..9e325b404 --- /dev/null +++ b/assets/js/370ac30b.c1f02bf9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9204],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.9/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.9/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.9/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/multi-user.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.9/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.9/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.9/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.9/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/372310f1.103b891b.js b/assets/js/372310f1.103b891b.js deleted file mode 100644 index c163b5e03..000000000 --- a/assets/js/372310f1.103b891b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6888],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=l.createContext({}),c=function(e){var t=l.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return l.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},m=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||u[m]||a;return n?l.createElement(f,o(o({ref:t},p),{},{components:n})):l.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,o=new Array(a);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var l=n(8168),r=(n(6540),n(5680));const a={},o="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.10/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.10/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.10/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-bundle-stages.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.10/concepts"},next:{title:"Git Repository Contents",permalink:"/0.10/gitrepo-content"}},s={},c=[{value:"Examining the Bundle Lifecycle With the CLI",id:"examining-the-bundle-lifecycle-with-the-cli",level:2},{value:"fleet apply",id:"fleet-apply",level:3},{value:"fleet target",id:"fleet-target",level:3},{value:"fleet deploy",id:"fleet-deploy",level:3},{value:"Lifecycle CLI Example",id:"lifecycle-cli-example",level:3}],p={toc:c},d="wrapper";function u(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,l.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,r.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,r.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"User will create a ",(0,r.yg)("a",{parentName:"li",href:"/0.10/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,r.yg)("a",{parentName:"li",href:"/0.10/webhook"},"webhook event"),". With every commit change, the ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,r.yg)("a",{parentName:"li",href:"/0.10/cluster-bundles-state#bundles"},"bundle"),".")),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,r.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,r.yg)("ol",{start:3},(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,r.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,r.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})),(0,r.yg)("h2",{id:"examining-the-bundle-lifecycle-with-the-cli"},"Examining the Bundle Lifecycle With the CLI"),(0,r.yg)("p",null,"Several fleet CLI commands help with debugging bundles."),(0,r.yg)("h3",{id:"fleet-apply"},"fleet apply"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/cli/fleet-cli/fleet_apply"},"Apply")," renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\n")),(0,r.yg)("p",null,"More information on how to create bundles with ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet apply")," can be found in the ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/bundle-add"},"section on bundles"),"."),(0,r.yg)("h3",{id:"fleet-target"},"fleet target"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/cli/fleet-cli/fleet_target"},"Target")," reads a bundle from a file and works with a live cluster to print out the ",(0,r.yg)("inlineCode",{parentName:"p"},"bundledeployment")," & ",(0,r.yg)("inlineCode",{parentName:"p"},"content"),' resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.'),(0,r.yg)("h3",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/cli/fleet-cli/fleet_deploy"},"Deploy")," takes the output of ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet target"),", or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment."),(0,r.yg)("p",null,"The deploy command can be used to bring bundles to air-gapped clusters."),(0,r.yg)("h3",{id:"lifecycle-cli-example"},"Lifecycle CLI Example"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\n# for information about apply see https://fleet.rancher.io/bundle-add\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\nfleet target --bundle-file bundle.yaml --list-inputs > bd.yaml\nfleet deploy --input-file bd.yaml --dry-run\n")))}u.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>l});const l=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/372310f1.c0c3c6e7.js b/assets/js/372310f1.c0c3c6e7.js new file mode 100644 index 000000000..ccd3ff4c6 --- /dev/null +++ b/assets/js/372310f1.c0c3c6e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6888],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=l.createContext({}),c=function(e){var t=l.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return l.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},m=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,f=d["".concat(s,".").concat(m)]||d[m]||u[m]||a;return n?l.createElement(f,o(o({ref:t},p),{},{components:n})):l.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,o=new Array(a);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var l=n(8168),r=(n(6540),n(5680));const a={},o="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.10/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.10/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.10/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-bundle-stages.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.10/concepts"},next:{title:"Git Repository Contents",permalink:"/0.10/gitrepo-content"}},s={},c=[{value:"Examining the Bundle Lifecycle With the CLI",id:"examining-the-bundle-lifecycle-with-the-cli",level:2},{value:"fleet apply",id:"fleet-apply",level:3},{value:"fleet target",id:"fleet-target",level:3},{value:"fleet deploy",id:"fleet-deploy",level:3},{value:"Lifecycle CLI Example",id:"lifecycle-cli-example",level:3}],p={toc:c},d="wrapper";function u(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,l.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,r.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,r.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"User will create a ",(0,r.yg)("a",{parentName:"li",href:"/0.10/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,r.yg)("a",{parentName:"li",href:"/0.10/webhook"},"webhook event"),". With every commit change, the ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,r.yg)("a",{parentName:"li",href:"/0.10/cluster-bundles-state#bundles"},"bundle"),".")),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,r.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,r.yg)("ol",{start:3},(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,r.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,r.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})),(0,r.yg)("h2",{id:"examining-the-bundle-lifecycle-with-the-cli"},"Examining the Bundle Lifecycle With the CLI"),(0,r.yg)("p",null,"Several fleet CLI commands help with debugging bundles."),(0,r.yg)("h3",{id:"fleet-apply"},"fleet apply"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/cli/fleet-cli/fleet_apply"},"Apply")," renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\n")),(0,r.yg)("p",null,"More information on how to create bundles with ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet apply")," can be found in the ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/bundle-add"},"section on bundles"),"."),(0,r.yg)("h3",{id:"fleet-target"},"fleet target"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/cli/fleet-cli/fleet_target"},"Target")," reads a bundle from a file and works with a live cluster to print out the ",(0,r.yg)("inlineCode",{parentName:"p"},"bundledeployment")," & ",(0,r.yg)("inlineCode",{parentName:"p"},"content"),' resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.'),(0,r.yg)("h3",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/cli/fleet-cli/fleet_deploy"},"Deploy")," takes the output of ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet target"),", or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment."),(0,r.yg)("p",null,"The deploy command can be used to bring bundles to air-gapped clusters."),(0,r.yg)("h3",{id:"lifecycle-cli-example"},"Lifecycle CLI Example"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\n# for information about apply see https://fleet.rancher.io/bundle-add\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\nfleet target --bundle-file bundle.yaml --list-inputs > bd.yaml\nfleet deploy --input-file bd.yaml --dry-run\n")))}u.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>l});const l=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/39f5e362.414ef944.js b/assets/js/39f5e362.414ef944.js new file mode 100644 index 000000000..977e7f636 --- /dev/null +++ b/assets/js/39f5e362.414ef944.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5316],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.5/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.5/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.5/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/concepts.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.5/quickstart"},next:{title:"Architecture",permalink:"/0.5/architecture"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.5/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"lifecycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.5/examples#lifecycle-of-a-fleet-bundle"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.5/examples#deploy-kubernetes-manifests-across-clusters-with-customization"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/39f5e362.cffb2814.js b/assets/js/39f5e362.cffb2814.js deleted file mode 100644 index c2db7cac9..000000000 --- a/assets/js/39f5e362.cffb2814.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5316],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.5/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.5/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.5/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/concepts.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.5/quickstart"},next:{title:"Architecture",permalink:"/0.5/architecture"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.5/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"lifecycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.5/examples#lifecycle-of-a-fleet-bundle"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.5/examples#deploy-kubernetes-manifests-across-clusters-with-customization"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a0e6d91.7c61044d.js b/assets/js/3a0e6d91.7c61044d.js new file mode 100644 index 000000000..f980b0534 --- /dev/null +++ b/assets/js/3a0e6d91.7c61044d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9242],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.9/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.9/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.9/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-bundle.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.9/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.9/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.9/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a2a2cbe.29f463ed.js b/assets/js/3a2a2cbe.29f463ed.js deleted file mode 100644 index 81490d624..000000000 --- a/assets/js/3a2a2cbe.29f463ed.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2610],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>g});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(t),m=r,g=d["".concat(s,".").concat(m)]||d[m]||u[m]||o;return t?a.createElement(g,l(l({ref:n},p),{},{components:t})):a.createElement(g,l({ref:n},p))}));function g(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},l="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.7/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.7/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.7/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/bundle-add.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.7/imagescan"},next:{title:"fleet-agent",permalink:"/0.7/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2}],p={toc:c},d="wrapper";function u(e){let{components:n,...t}=e;return(0,r.yg)(d,(0,a.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3a2a2cbe.477de2e4.js b/assets/js/3a2a2cbe.477de2e4.js new file mode 100644 index 000000000..094ecf675 --- /dev/null +++ b/assets/js/3a2a2cbe.477de2e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2610],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>g});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(t),m=r,g=d["".concat(s,".").concat(m)]||d[m]||u[m]||o;return t?a.createElement(g,l(l({ref:n},p),{},{components:t})):a.createElement(g,l({ref:n},p))}));function g(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},l="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.7/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.7/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.7/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/bundle-add.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.7/imagescan"},next:{title:"fleet-agent",permalink:"/0.7/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2}],p={toc:c},d="wrapper";function u(e){let{components:n,...t}=e;return(0,r.yg)(d,(0,a.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3b8c55ea.3a733d57.js b/assets/js/3b8c55ea.3a733d57.js new file mode 100644 index 000000000..a43029e20 --- /dev/null +++ b/assets/js/3b8c55ea.3a733d57.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6803],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>A});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),c=a(1682),u=a(9466);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,c]=m({queryString:a,groupId:l}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,u.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),y=(()=>{const e=i??d;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{y&&o(y)}),[y]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,r]),tabValues:r}}var y=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=u.indexOf(t),l=c[a].value;l!==o&&(d(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=u.indexOf(e.currentTarget)+1;t=u[a]??u[0];break}case"ArrowLeft":{const a=u.indexOf(e.currentTarget)-1;t=u[a]??u[u.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},c.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>u.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=g(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function A(e){const t=(0,y.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},9824:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var l=a(8168),n=(a(6540),a(5680)),r=a(7858),s=a(2355),o=a(1470),i=a(9365);const c={},u="Installation Details",d={unversionedId:"installation",id:"installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/installation.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/cluster-registration"}},p={},h=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Multi-controller install: sharding",id:"multi-controller-install-sharding",level:2},{value:"Deployment",id:"deployment",level:3},{value:"How it works",id:"how-it-works",level:3},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],m={toc:h},g="wrapper";function y(e){let{components:t,...c}=e;return(0,n.yg)(g,(0,l.A)({},m,c,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"installation-details"},"Installation Details"),(0,n.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,n.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,n.yg)("p",null,(0,n.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,n.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,n.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,n.yg)(i.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,n.yg)("h2",{id:"default-install"},"Default Install"),(0,n.yg)("p",null,"Install the following two Helm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,n.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,n.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,n.yg)("p",null,"First add Fleet's Helm repository."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,n.yg)(i.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,n.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"You can now ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-add"},"register some git repos")," in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,n.yg)("h2",{id:"multi-controller-install-sharding"},"Multi-controller install: sharding"),(0,n.yg)("h3",{id:"deployment"},"Deployment"),(0,n.yg)("p",null,"From 0.10 onwards, Fleet supports static sharding.\nEach shard is defined by its shard ID.\nOptionally, a shard can have a ",(0,n.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector"},"node\nselector"),", instructing Fleet to\ncreate all controller pods and jobs for that shard on nodes matching that selector."),(0,n.yg)("p",null,"The Fleet controller chart can be installed with the following arguments:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].id=$shard_id")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].nodeSelector.$key=$value"))),(0,n.yg)("p",null,"This will result in:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"as many Fleet controller and gitjob deployments as specified unique shard IDs,"),(0,n.yg)("li",{parentName:"ul"},"plus the usual unsharded Fleet controller pod. That latter pod will be the only one containing agent management and\ncleanup containers.")),(0,n.yg)("p",null,"For instance:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'$ helm -n cattle-fleet-system install --create-namespace --wait fleet fleet/fleet \\\n --set shards[0].id=foo \\\n --set shards[0].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-0 \\\n --set shards[1].id=bar \\\n --set shards[1].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-1 \\\n --set shards[2].id=baz \\\n --set shards[2].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-2 \\\n\n$ kubectl -n cattle-fleet-system get pods -l app=fleet-controller \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\nfleet-controller-b4c469c85-rj2q8 k3d-upstream-server-2\nfleet-controller-shard-bar-5f5999958f-nt4bm bar k3d-upstream-server-1\nfleet-controller-shard-baz-75c8587898-2wkk9 baz k3d-upstream-server-2\nfleet-controller-shard-foo-55478fb9d8-42q2f foo k3d-upstream-server-0\n\n$ kubectl -n cattle-fleet-system get pods -l app=gitjob \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\ngitjob-8498c6d78b-mdhgh k3d-upstream-server-1\ngitjob-shard-bar-8659ffc945-9vtlx bar k3d-upstream-server-1\ngitjob-shard-baz-6d67f596dc-fsz9m baz k3d-upstream-server-2\ngitjob-shard-foo-8697bb7f67-wzsfj foo k3d-upstream-server-0\n')),(0,n.yg)("h3",{id:"how-it-works"},"How it works"),(0,n.yg)("p",null,"With sharding in place, each Fleet controller will process resources bearing its own shard ID. This also holds for the\nunsharded controller, which has no set shard ID and will therefore process all unsharded resources."),(0,n.yg)("p",null,"To deploy a GitRepo for a specific shard, simply add label ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.cattle.io/shard-ref")," with your desired shard ID as a\nvalue.\nHere is an example:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"$ kubectl apply -n fleet-local -f - < ca.pem\n")),(0,n.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,n.yg)(i.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,n.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,n.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("h4",{id:"validate"},"Validate"),(0,n.yg)("p",null,"First validate the server URL is correct."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,n.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,n.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"If you get a valid JSON response or an ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,n.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,n.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,n.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,n.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,n.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,n.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,n.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,n.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,n.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,n.yg)(i.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,n.yg)("a",{parentName:"p",href:"/cluster-registration"},"register clusters")," and ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}y.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>l});const l=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/3b8c55ea.b2937e87.js b/assets/js/3b8c55ea.b2937e87.js deleted file mode 100644 index 4bb2e7c08..000000000 --- a/assets/js/3b8c55ea.b2937e87.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6803],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>A});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),c=a(1682),u=a(9466);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,c]=m({queryString:a,groupId:l}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,u.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),y=(()=>{const e=i??d;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{y&&o(y)}),[y]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,r]),tabValues:r}}var y=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=u.indexOf(t),l=c[a].value;l!==o&&(d(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=u.indexOf(e.currentTarget)+1;t=u[a]??u[0];break}case"ArrowLeft":{const a=u.indexOf(e.currentTarget)-1;t=u[a]??u[u.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},c.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>u.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=g(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function A(e){const t=(0,y.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},9824:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var l=a(8168),n=(a(6540),a(5680)),r=a(7858),s=a(2355),o=a(1470),i=a(9365);const c={},u="Installation Details",d={unversionedId:"installation",id:"installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/installation.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/cluster-registration"}},p={},h=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Multi-controller install: sharding",id:"multi-controller-install-sharding",level:2},{value:"Deployment",id:"deployment",level:3},{value:"How it works",id:"how-it-works",level:3},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],m={toc:h},g="wrapper";function y(e){let{components:t,...c}=e;return(0,n.yg)(g,(0,l.A)({},m,c,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"installation-details"},"Installation Details"),(0,n.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,n.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,n.yg)("p",null,(0,n.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,n.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,n.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,n.yg)(i.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,n.yg)("h2",{id:"default-install"},"Default Install"),(0,n.yg)("p",null,"Install the following two Helm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,n.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,n.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,n.yg)("p",null,"First add Fleet's Helm repository."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,n.yg)(i.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,n.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"You can now ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-add"},"register some git repos")," in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,n.yg)("h2",{id:"multi-controller-install-sharding"},"Multi-controller install: sharding"),(0,n.yg)("h3",{id:"deployment"},"Deployment"),(0,n.yg)("p",null,"From 0.10 onwards, Fleet supports static sharding.\nEach shard is defined by its shard ID.\nOptionally, a shard can have a ",(0,n.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector"},"node\nselector"),", instructing Fleet to\ncreate all controller pods and jobs for that shard on nodes matching that selector."),(0,n.yg)("p",null,"The Fleet controller chart can be installed with the following arguments:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].id=$shard_id")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].nodeSelector.$key=$value"))),(0,n.yg)("p",null,"This will result in:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"as many Fleet controller and gitjob deployments as specified unique shard IDs,"),(0,n.yg)("li",{parentName:"ul"},"plus the usual unsharded Fleet controller pod. That latter pod will be the only one containing agent management and\ncleanup containers.")),(0,n.yg)("p",null,"For instance:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'$ helm -n cattle-fleet-system install --create-namespace --wait fleet fleet/fleet \\\n --set shards[0].id=foo \\\n --set shards[0].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-0 \\\n --set shards[1].id=bar \\\n --set shards[1].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-1 \\\n --set shards[2].id=baz \\\n --set shards[2].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-2 \\\n\n$ kubectl -n cattle-fleet-system get pods -l app=fleet-controller \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\nfleet-controller-b4c469c85-rj2q8 k3d-upstream-server-2\nfleet-controller-shard-bar-5f5999958f-nt4bm bar k3d-upstream-server-1\nfleet-controller-shard-baz-75c8587898-2wkk9 baz k3d-upstream-server-2\nfleet-controller-shard-foo-55478fb9d8-42q2f foo k3d-upstream-server-0\n\n$ kubectl -n cattle-fleet-system get pods -l app=gitjob \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\ngitjob-8498c6d78b-mdhgh k3d-upstream-server-1\ngitjob-shard-bar-8659ffc945-9vtlx bar k3d-upstream-server-1\ngitjob-shard-baz-6d67f596dc-fsz9m baz k3d-upstream-server-2\ngitjob-shard-foo-8697bb7f67-wzsfj foo k3d-upstream-server-0\n')),(0,n.yg)("h3",{id:"how-it-works"},"How it works"),(0,n.yg)("p",null,"With sharding in place, each Fleet controller will process resources bearing its own shard ID. This also holds for the\nunsharded controller, which has no set shard ID and will therefore process all unsharded resources."),(0,n.yg)("p",null,"To deploy a GitRepo for a specific shard, simply add label ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.cattle.io/shard-ref")," with your desired shard ID as a\nvalue.\nHere is an example:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"$ kubectl apply -n fleet-local -f - < ca.pem\n")),(0,n.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,n.yg)(i.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,n.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,n.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("h4",{id:"validate"},"Validate"),(0,n.yg)("p",null,"First validate the server URL is correct."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,n.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,n.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"If you get a valid JSON response or an ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,n.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,n.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,n.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,n.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,n.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,n.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,n.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,n.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,n.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,n.yg)(i.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,n.yg)("a",{parentName:"p",href:"/cluster-registration"},"register clusters")," and ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}y.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>l});const l=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/3d725b75.ab5aa125.js b/assets/js/3d725b75.ab5aa125.js deleted file mode 100644 index b858b9b90..000000000 --- a/assets/js/3d725b75.ab5aa125.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2276],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var n in t)hasOwnProperty.call(t,n)&&(o[n]=t[n]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.6.0",date:"2023-04-05 13:35:35 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.6.0",id:"version-0.6/changelogs/changelogs/v0.6.0",title:"v0.6.0",description:"(rancherio-gh-m) released this 2023-04-05 1335 +0000 UTC",source:"@site/versioned_docs/version-0.6/changelogs/changelogs/v0.6.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.6.0",permalink:"/0.6/changelogs/changelogs/v0.6.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/changelogs/changelogs/v0.6.0.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.6.0",date:"2023-04-05 13:35:35 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.6/troubleshooting"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-04-05 13:35:35 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade."),(0,l.yg)("p",null,"When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from ",(0,l.yg)("code",null,"fleet-system")," to ",(0,l.yg)("code",null,"cattle-fleet-system"),". This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover ",(0,l.yg)("code",null,"fleet-system")," namespaces. In older versions of fleet, it's possible to ",(0,l.yg)("a",{href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1379027121","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard"},"copy the agent config manually")," into the new namespace, or to ",(0,l.yg)("a",{href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1381884485","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard"},"trigger the agent redeployment manually"),"."),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add authentication support for OCI based Helm charts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1382535855","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/996","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/996/hovercard",href:"https://github.com/rancher/fleet/pull/996"},"#996")),(0,l.yg)("li",null,"Support cluster repo change by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1383692338","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/999","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/999/hovercard",href:"https://github.com/rancher/fleet/pull/999"},"#999")),(0,l.yg)("li",null,"Apply gitrepo labels to bundles by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1387681511","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1007","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1007/hovercard",href:"https://github.com/rancher/fleet/pull/1007"},"#1007")),(0,l.yg)("li",null,"Add allowedTargetNamespaces to GitRepoRestriction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1387780415","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1008","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1008/hovercard",href:"https://github.com/rancher/fleet/pull/1008"},"#1008")),(0,l.yg)("li",null,"Enforce presence of targetNamespace if gitreporestriction is present. by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1406564518","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1022","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1022/hovercard",href:"https://github.com/rancher/fleet/pull/1022"},"#1022")),(0,l.yg)("li",null,"Cluster specific registry replaces global registry by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1421104730","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1053","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1053/hovercard",href:"https://github.com/rancher/fleet/pull/1053"},"#1053")),(0,l.yg)("li",null,"Reading contents&secrets uses specific service account by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1427386967","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1063","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1063/hovercard",href:"https://github.com/rancher/fleet/pull/1063"},"#1063")),(0,l.yg)("li",null,"Cluster values full templating by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1479381039","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1158","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1158/hovercard",href:"https://github.com/rancher/fleet/pull/1158"},"#1158")),(0,l.yg)("li",null,"Helm Target Customization Repo/Version Override by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/romejoe/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/romejoe"},"@romejoe")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1392005466","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1011","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1011/hovercard",href:"https://github.com/rancher/fleet/pull/1011"},"#1011")),(0,l.yg)("li",null,"Sprig Templating for Helm Values with Inputs from Cluster Resource by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rajiteh/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rajiteh"},"@rajiteh")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1071078279","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/671","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/671/hovercard",href:"https://github.com/rancher/fleet/pull/671"},"#671")),(0,l.yg)("li",null,"Add helmRepoUrlRegex to the GitRepo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1525653440","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1234","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1234/hovercard",href:"https://github.com/rancher/fleet/pull/1234"},"#1234"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix token expiry bug by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1382301009","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/995","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/995/hovercard",href:"https://github.com/rancher/fleet/pull/995"},"#995")),(0,l.yg)("li",null,"Stop re-queuing on failed deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/mattfarina/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/mattfarina"},"@mattfarina")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1417680330","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1042","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1042/hovercard",href:"https://github.com/rancher/fleet/pull/1042"},"#1042")),(0,l.yg)("li",null,"Sync only changed objects by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1416805201","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1041","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1041/hovercard",href:"https://github.com/rancher/fleet/pull/1041"},"#1041")),(0,l.yg)("li",null,"Returning nil on signal exit by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/mattfarina/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/mattfarina"},"@mattfarina")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1452302735","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1104","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1104/hovercard",href:"https://github.com/rancher/fleet/pull/1104"},"#1104")),(0,l.yg)("li",null,"Running helm template to set up status ignores errors by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1451980114","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1103","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1103/hovercard",href:"https://github.com/rancher/fleet/pull/1103"},"#1103")),(0,l.yg)("li",null,"Do not fail on missing labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1458013071","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1114","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1114/hovercard",href:"https://github.com/rancher/fleet/pull/1114"},"#1114")),(0,l.yg)("li",null,"Limit recursion depth for cluster label replacement in values by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1469990739","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1143","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1143/hovercard",href:"https://github.com/rancher/fleet/pull/1143"},"#1143")),(0,l.yg)("li",null,"Update bundle status display also in case of errors by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1464493213","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1123","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1123/hovercard",href:"https://github.com/rancher/fleet/pull/1123"},"#1123")),(0,l.yg)("li",null,"Disable Gitops Feature Breaks Fleet Controller Deployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/SharpThunder/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/SharpThunder"},"@SharpThunder")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1500613071","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1185","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1185/hovercard",href:"https://github.com/rancher/fleet/pull/1185"},"#1185")),(0,l.yg)("li",null,"Do not ignore agentCheckinInterval by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1423798925","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1058","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1058/hovercard",href:"https://github.com/rancher/fleet/pull/1058"},"#1058")),(0,l.yg)("li",null,"Scaling: avoid needlessly looking up agent bundle deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1425571981","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1062","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1062/hovercard",href:"https://github.com/rancher/fleet/pull/1062"},"#1062")),(0,l.yg)("li",null,"Fix image scan issues by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1498888333","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1181","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1181/hovercard",href:"https://github.com/rancher/fleet/pull/1181"},"#1181")),(0,l.yg)("li",null,"Fix orphan resources created by operators by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504794320","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1201","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1201/hovercard",href:"https://github.com/rancher/fleet/pull/1201"},"#1201")),(0,l.yg)("li",null,"Don't run kustomize on repos without kustomization by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1476914588","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1157","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1157/hovercard",href:"https://github.com/rancher/fleet/pull/1157"},"#1157")),(0,l.yg)("li",null,"Fix regression in imagescan test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1516558989","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1228/hovercard",href:"https://github.com/rancher/fleet/pull/1228"},"#1228")),(0,l.yg)("li",null,"Long release names, shorten only once by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1556499775","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1273","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1273/hovercard",href:"https://github.com/rancher/fleet/pull/1273"},"#1273")),(0,l.yg)("li",null,"Fix agent not starting in fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1585835809","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1323","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1323/hovercard",href:"https://github.com/rancher/fleet/pull/1323"},"#1323")),(0,l.yg)("li",null,"Ensure valid release name for agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1604911765","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1357","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1357/hovercard",href:"https://github.com/rancher/fleet/pull/1357"},"#1357")),(0,l.yg)("li",null,"Bump Gitjob to v0.1.37 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1586174726","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1326","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1326/hovercard",href:"https://github.com/rancher/fleet/pull/1326"},"#1326"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Removing the docs directory by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/mattfarina/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/mattfarina"},"@mattfarina")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1395008018","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1014","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1014/hovercard",href:"https://github.com/rancher/fleet/pull/1014"},"#1014")),(0,l.yg)("li",null,"Scripts for local testing with k3d by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1407494284","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1024","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1024/hovercard",href:"https://github.com/rancher/fleet/pull/1024"},"#1024")),(0,l.yg)("li",null,"Debug statements for controllers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1414909060","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1036","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1036/hovercard",href:"https://github.com/rancher/fleet/pull/1036"},"#1036")),(0,l.yg)("li",null,"Scaling: make ClusterEnqueueDelay configurable via environment variable by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1434599858","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1071","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1071/hovercard",href:"https://github.com/rancher/fleet/pull/1071"},"#1071")),(0,l.yg)("li",null,"Add nightly builds by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1436218080","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1075","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1075/hovercard",href:"https://github.com/rancher/fleet/pull/1075"},"#1075")),(0,l.yg)("li",null,"Cluster registration debug messages and comments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1449716259","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1095","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1095/hovercard",href:"https://github.com/rancher/fleet/pull/1095"},"#1095")),(0,l.yg)("li",null,"Add support to continuous pprof CPU profiling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1436593660","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1076","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1076/hovercard",href:"https://github.com/rancher/fleet/pull/1076"},"#1076")),(0,l.yg)("li",null,"Split DEVELOPING.md into separate files in docs/ by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1468082145","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1134","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1134/hovercard",href:"https://github.com/rancher/fleet/pull/1134"},"#1134")),(0,l.yg)("li",null,"Add CLI to generate reference docs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1464695140","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1126","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1126/hovercard",href:"https://github.com/rancher/fleet/pull/1126"},"#1126")),(0,l.yg)("li",null,"Allow to run longer before killing leader during debugging by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1469310847","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1137","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1137/hovercard",href:"https://github.com/rancher/fleet/pull/1137"},"#1137")),(0,l.yg)("li",null,"Introduce parameter to debug controller but not agents by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1464500460","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1124","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1124/hovercard",href:"https://github.com/rancher/fleet/pull/1124"},"#1124")),(0,l.yg)("li",null,"Fix CRD download url by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/olblak/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/olblak"},"@olblak")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1502535254","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1190","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1190/hovercard",href:"https://github.com/rancher/fleet/pull/1190"},"#1190")),(0,l.yg)("li",null,"Add Github Action workflow to prevent manual changes to Gitjob or generated code by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1529255527","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1239","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1239/hovercard",href:"https://github.com/rancher/fleet/pull/1239"},"#1239")),(0,l.yg)("li",null,"Fleet in Rancher Upgrade CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1503243355","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1198","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1198/hovercard",href:"https://github.com/rancher/fleet/pull/1198"},"#1198"))),(0,l.yg)("h2",null,"New Contributors"),(0,l.yg)("ul",null,(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/romejoe/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/romejoe"},"@romejoe")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1392005466","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1011","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1011/hovercard",href:"https://github.com/rancher/fleet/pull/1011"},"#1011")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rajiteh/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rajiteh"},"@rajiteh")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1071078279","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/671","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/671/hovercard",href:"https://github.com/rancher/fleet/pull/671"},"#671")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/fossabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/fossabot"},"@fossabot")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"927564652","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/431","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/431/hovercard",href:"https://github.com/rancher/fleet/pull/431"},"#431")),(0,l.yg)("li",null,"@github-actions made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1500198507","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1182","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1182/hovercard",href:"https://github.com/rancher/fleet/pull/1182"},"#1182")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/SharpThunder/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/SharpThunder"},"@SharpThunder")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1500613071","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1185","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1185/hovercard",href:"https://github.com/rancher/fleet/pull/1185"},"#1185")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1476914588","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1157","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1157/hovercard",href:"https://github.com/rancher/fleet/pull/1157"},"#1157"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.6.0"},(0,l.yg)("tt",null,"v0.5.0...v0.6.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},"fleet-crd-0.6.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz"},"fleet-agent-0.6.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz"},"fleet-0.6.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-linux-s390x"},"fleet-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.6.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3d725b75.dd2722ad.js b/assets/js/3d725b75.dd2722ad.js new file mode 100644 index 000000000..4c01827b1 --- /dev/null +++ b/assets/js/3d725b75.dd2722ad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2276],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var n in t)hasOwnProperty.call(t,n)&&(o[n]=t[n]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.6.0",date:"2023-04-05 13:35:35 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.6.0",id:"version-0.6/changelogs/changelogs/v0.6.0",title:"v0.6.0",description:"(rancherio-gh-m) released this 2023-04-05 1335 +0000 UTC",source:"@site/versioned_docs/version-0.6/changelogs/changelogs/v0.6.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.6.0",permalink:"/0.6/changelogs/changelogs/v0.6.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/changelogs/changelogs/v0.6.0.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.6.0",date:"2023-04-05 13:35:35 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.6/troubleshooting"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-04-05 13:35:35 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade."),(0,l.yg)("p",null,"When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from ",(0,l.yg)("code",null,"fleet-system")," to ",(0,l.yg)("code",null,"cattle-fleet-system"),". This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover ",(0,l.yg)("code",null,"fleet-system")," namespaces. In older versions of fleet, it's possible to ",(0,l.yg)("a",{href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1379027121","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard"},"copy the agent config manually")," into the new namespace, or to ",(0,l.yg)("a",{href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1381884485","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard"},"trigger the agent redeployment manually"),"."),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add authentication support for OCI based Helm charts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1382535855","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/996","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/996/hovercard",href:"https://github.com/rancher/fleet/pull/996"},"#996")),(0,l.yg)("li",null,"Support cluster repo change by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1383692338","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/999","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/999/hovercard",href:"https://github.com/rancher/fleet/pull/999"},"#999")),(0,l.yg)("li",null,"Apply gitrepo labels to bundles by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1387681511","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1007","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1007/hovercard",href:"https://github.com/rancher/fleet/pull/1007"},"#1007")),(0,l.yg)("li",null,"Add allowedTargetNamespaces to GitRepoRestriction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1387780415","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1008","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1008/hovercard",href:"https://github.com/rancher/fleet/pull/1008"},"#1008")),(0,l.yg)("li",null,"Enforce presence of targetNamespace if gitreporestriction is present. by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1406564518","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1022","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1022/hovercard",href:"https://github.com/rancher/fleet/pull/1022"},"#1022")),(0,l.yg)("li",null,"Cluster specific registry replaces global registry by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1421104730","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1053","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1053/hovercard",href:"https://github.com/rancher/fleet/pull/1053"},"#1053")),(0,l.yg)("li",null,"Reading contents&secrets uses specific service account by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1427386967","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1063","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1063/hovercard",href:"https://github.com/rancher/fleet/pull/1063"},"#1063")),(0,l.yg)("li",null,"Cluster values full templating by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1479381039","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1158","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1158/hovercard",href:"https://github.com/rancher/fleet/pull/1158"},"#1158")),(0,l.yg)("li",null,"Helm Target Customization Repo/Version Override by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/romejoe/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/romejoe"},"@romejoe")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1392005466","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1011","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1011/hovercard",href:"https://github.com/rancher/fleet/pull/1011"},"#1011")),(0,l.yg)("li",null,"Sprig Templating for Helm Values with Inputs from Cluster Resource by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rajiteh/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rajiteh"},"@rajiteh")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1071078279","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/671","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/671/hovercard",href:"https://github.com/rancher/fleet/pull/671"},"#671")),(0,l.yg)("li",null,"Add helmRepoUrlRegex to the GitRepo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1525653440","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1234","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1234/hovercard",href:"https://github.com/rancher/fleet/pull/1234"},"#1234"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix token expiry bug by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1382301009","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/995","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/995/hovercard",href:"https://github.com/rancher/fleet/pull/995"},"#995")),(0,l.yg)("li",null,"Stop re-queuing on failed deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/mattfarina/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/mattfarina"},"@mattfarina")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1417680330","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1042","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1042/hovercard",href:"https://github.com/rancher/fleet/pull/1042"},"#1042")),(0,l.yg)("li",null,"Sync only changed objects by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1416805201","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1041","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1041/hovercard",href:"https://github.com/rancher/fleet/pull/1041"},"#1041")),(0,l.yg)("li",null,"Returning nil on signal exit by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/mattfarina/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/mattfarina"},"@mattfarina")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1452302735","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1104","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1104/hovercard",href:"https://github.com/rancher/fleet/pull/1104"},"#1104")),(0,l.yg)("li",null,"Running helm template to set up status ignores errors by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1451980114","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1103","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1103/hovercard",href:"https://github.com/rancher/fleet/pull/1103"},"#1103")),(0,l.yg)("li",null,"Do not fail on missing labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1458013071","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1114","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1114/hovercard",href:"https://github.com/rancher/fleet/pull/1114"},"#1114")),(0,l.yg)("li",null,"Limit recursion depth for cluster label replacement in values by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1469990739","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1143","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1143/hovercard",href:"https://github.com/rancher/fleet/pull/1143"},"#1143")),(0,l.yg)("li",null,"Update bundle status display also in case of errors by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1464493213","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1123","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1123/hovercard",href:"https://github.com/rancher/fleet/pull/1123"},"#1123")),(0,l.yg)("li",null,"Disable Gitops Feature Breaks Fleet Controller Deployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/SharpThunder/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/SharpThunder"},"@SharpThunder")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1500613071","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1185","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1185/hovercard",href:"https://github.com/rancher/fleet/pull/1185"},"#1185")),(0,l.yg)("li",null,"Do not ignore agentCheckinInterval by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1423798925","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1058","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1058/hovercard",href:"https://github.com/rancher/fleet/pull/1058"},"#1058")),(0,l.yg)("li",null,"Scaling: avoid needlessly looking up agent bundle deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1425571981","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1062","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1062/hovercard",href:"https://github.com/rancher/fleet/pull/1062"},"#1062")),(0,l.yg)("li",null,"Fix image scan issues by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1498888333","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1181","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1181/hovercard",href:"https://github.com/rancher/fleet/pull/1181"},"#1181")),(0,l.yg)("li",null,"Fix orphan resources created by operators by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504794320","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1201","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1201/hovercard",href:"https://github.com/rancher/fleet/pull/1201"},"#1201")),(0,l.yg)("li",null,"Don't run kustomize on repos without kustomization by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1476914588","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1157","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1157/hovercard",href:"https://github.com/rancher/fleet/pull/1157"},"#1157")),(0,l.yg)("li",null,"Fix regression in imagescan test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1516558989","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1228/hovercard",href:"https://github.com/rancher/fleet/pull/1228"},"#1228")),(0,l.yg)("li",null,"Long release names, shorten only once by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1556499775","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1273","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1273/hovercard",href:"https://github.com/rancher/fleet/pull/1273"},"#1273")),(0,l.yg)("li",null,"Fix agent not starting in fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1585835809","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1323","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1323/hovercard",href:"https://github.com/rancher/fleet/pull/1323"},"#1323")),(0,l.yg)("li",null,"Ensure valid release name for agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1604911765","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1357","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1357/hovercard",href:"https://github.com/rancher/fleet/pull/1357"},"#1357")),(0,l.yg)("li",null,"Bump Gitjob to v0.1.37 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1586174726","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1326","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1326/hovercard",href:"https://github.com/rancher/fleet/pull/1326"},"#1326"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Removing the docs directory by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/mattfarina/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/mattfarina"},"@mattfarina")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1395008018","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1014","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1014/hovercard",href:"https://github.com/rancher/fleet/pull/1014"},"#1014")),(0,l.yg)("li",null,"Scripts for local testing with k3d by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1407494284","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1024","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1024/hovercard",href:"https://github.com/rancher/fleet/pull/1024"},"#1024")),(0,l.yg)("li",null,"Debug statements for controllers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1414909060","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1036","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1036/hovercard",href:"https://github.com/rancher/fleet/pull/1036"},"#1036")),(0,l.yg)("li",null,"Scaling: make ClusterEnqueueDelay configurable via environment variable by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1434599858","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1071","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1071/hovercard",href:"https://github.com/rancher/fleet/pull/1071"},"#1071")),(0,l.yg)("li",null,"Add nightly builds by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1436218080","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1075","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1075/hovercard",href:"https://github.com/rancher/fleet/pull/1075"},"#1075")),(0,l.yg)("li",null,"Cluster registration debug messages and comments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1449716259","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1095","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1095/hovercard",href:"https://github.com/rancher/fleet/pull/1095"},"#1095")),(0,l.yg)("li",null,"Add support to continuous pprof CPU profiling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1436593660","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1076","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1076/hovercard",href:"https://github.com/rancher/fleet/pull/1076"},"#1076")),(0,l.yg)("li",null,"Split DEVELOPING.md into separate files in docs/ by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1468082145","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1134","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1134/hovercard",href:"https://github.com/rancher/fleet/pull/1134"},"#1134")),(0,l.yg)("li",null,"Add CLI to generate reference docs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1464695140","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1126","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1126/hovercard",href:"https://github.com/rancher/fleet/pull/1126"},"#1126")),(0,l.yg)("li",null,"Allow to run longer before killing leader during debugging by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1469310847","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1137","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1137/hovercard",href:"https://github.com/rancher/fleet/pull/1137"},"#1137")),(0,l.yg)("li",null,"Introduce parameter to debug controller but not agents by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1464500460","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1124","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1124/hovercard",href:"https://github.com/rancher/fleet/pull/1124"},"#1124")),(0,l.yg)("li",null,"Fix CRD download url by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/olblak/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/olblak"},"@olblak")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1502535254","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1190","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1190/hovercard",href:"https://github.com/rancher/fleet/pull/1190"},"#1190")),(0,l.yg)("li",null,"Add Github Action workflow to prevent manual changes to Gitjob or generated code by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1529255527","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1239","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1239/hovercard",href:"https://github.com/rancher/fleet/pull/1239"},"#1239")),(0,l.yg)("li",null,"Fleet in Rancher Upgrade CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1503243355","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1198","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1198/hovercard",href:"https://github.com/rancher/fleet/pull/1198"},"#1198"))),(0,l.yg)("h2",null,"New Contributors"),(0,l.yg)("ul",null,(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/romejoe/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/romejoe"},"@romejoe")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1392005466","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1011","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1011/hovercard",href:"https://github.com/rancher/fleet/pull/1011"},"#1011")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rajiteh/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rajiteh"},"@rajiteh")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1071078279","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/671","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/671/hovercard",href:"https://github.com/rancher/fleet/pull/671"},"#671")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/fossabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/fossabot"},"@fossabot")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"927564652","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/431","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/431/hovercard",href:"https://github.com/rancher/fleet/pull/431"},"#431")),(0,l.yg)("li",null,"@github-actions made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1500198507","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1182","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1182/hovercard",href:"https://github.com/rancher/fleet/pull/1182"},"#1182")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/SharpThunder/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/SharpThunder"},"@SharpThunder")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1500613071","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1185","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1185/hovercard",href:"https://github.com/rancher/fleet/pull/1185"},"#1185")),(0,l.yg)("li",null,(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," made their first contribution in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1476914588","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1157","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1157/hovercard",href:"https://github.com/rancher/fleet/pull/1157"},"#1157"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.6.0"},(0,l.yg)("tt",null,"v0.5.0...v0.6.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},"fleet-crd-0.6.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz"},"fleet-agent-0.6.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz"},"fleet-0.6.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-linux-s390x"},"fleet-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.6.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3d7b86e7.9c6033fa.js b/assets/js/3d7b86e7.0dc32e9f.js similarity index 79% rename from assets/js/3d7b86e7.9c6033fa.js rename to assets/js/3d7b86e7.0dc32e9f.js index eb523914a..e3582021b 100644 --- a/assets/js/3d7b86e7.9c6033fa.js +++ b/assets/js/3d7b86e7.0dc32e9f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2931],{5680:(e,r,t)=>{t.d(r,{xA:()=>u,yg:()=>m});var n=t(6540);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function s(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=n.createContext({}),l=function(e){var r=n.useContext(i),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=l(e.components);return n.createElement(i.Provider,{value:r},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,s=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(t),d=o,m=p["".concat(i,".").concat(d)]||p[d]||f[d]||s;return t?n.createElement(m,a(a({ref:r},u),{},{components:t})):n.createElement(m,a({ref:r},u))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var s=t.length,a=new Array(s);a[0]=d;var c={};for(var i in r)hasOwnProperty.call(r,i)&&(c[i]=r[i]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{t.r(r),t.d(r,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var n=t(8168),o=(t(6540),t(5680));const s={},a="Custom Resources",c={unversionedId:"ref-resources",id:"version-0.6/ref-resources",title:"Custom Resources",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.6/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.6/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-resources.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.6/namespaces"},next:{title:"Installation Details",permalink:"/0.6/installation"}},i={},l=[],u={toc:l},p="wrapper";function f(e){let{components:r,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:r,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources"},"Custom Resources"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:t(4467).A,width:"831",height:"1341"})))}f.isMDXComponent=!0},4467:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2931],{5680:(e,r,t)=>{t.d(r,{xA:()=>u,yg:()=>m});var n=t(6540);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function s(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=n.createContext({}),l=function(e){var r=n.useContext(i),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=l(e.components);return n.createElement(i.Provider,{value:r},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,s=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(t),d=o,m=p["".concat(i,".").concat(d)]||p[d]||f[d]||s;return t?n.createElement(m,a(a({ref:r},u),{},{components:t})):n.createElement(m,a({ref:r},u))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var s=t.length,a=new Array(s);a[0]=d;var c={};for(var i in r)hasOwnProperty.call(r,i)&&(c[i]=r[i]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{t.r(r),t.d(r,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var n=t(8168),o=(t(6540),t(5680));const s={},a="Custom Resources",c={unversionedId:"ref-resources",id:"version-0.6/ref-resources",title:"Custom Resources",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.6/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.6/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-resources.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.6/namespaces"},next:{title:"Installation Details",permalink:"/0.6/installation"}},i={},l=[],u={toc:l},p="wrapper";function f(e){let{components:r,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:r,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources"},"Custom Resources"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:t(4467).A,width:"831",height:"1341"})))}f.isMDXComponent=!0},4467:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file diff --git a/assets/js/4177aba1.3a2cab36.js b/assets/js/4177aba1.a7a7fe2a.js similarity index 61% rename from assets/js/4177aba1.3a2cab36.js rename to assets/js/4177aba1.a7a7fe2a.js index 5a9ec157a..9b4d995f5 100644 --- a/assets/js/4177aba1.3a2cab36.js +++ b/assets/js/4177aba1.a7a7fe2a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5411],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},6383:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.8/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.8/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.8/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/quickstart.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.8/"},next:{title:"Creating a Deployment",permalink:"/0.8/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be ran in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5411],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},6383:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.8/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.8/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.8/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/quickstart.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.8/"},next:{title:"Creating a Deployment",permalink:"/0.8/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be ran in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/41b31679.11585cde.js b/assets/js/41b31679.11585cde.js new file mode 100644 index 000000000..73ea66e8e --- /dev/null +++ b/assets/js/41b31679.11585cde.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4714],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.9/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.9/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.9/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/troubleshooting.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.9/ref-bundle"},next:{title:"v0.9.0",permalink:"/0.9/changelogs/changelogs/v0.9.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,a.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.9/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/41b31679.116dff97.js b/assets/js/41b31679.116dff97.js deleted file mode 100644 index b29c7968f..000000000 --- a/assets/js/41b31679.116dff97.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4714],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.9/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.9/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.9/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/troubleshooting.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.9/ref-bundle"},next:{title:"v0.9.0",permalink:"/0.9/changelogs/changelogs/v0.9.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,a.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.9/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.9/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/420e9d8d.790b844c.js b/assets/js/420e9d8d.89b80f21.js similarity index 51% rename from assets/js/420e9d8d.790b844c.js rename to assets/js/420e9d8d.89b80f21.js index 6ab325108..32a519773 100644 --- a/assets/js/420e9d8d.790b844c.js +++ b/assets/js/420e9d8d.89b80f21.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3615],{5680:(e,t,r)=>{r.d(t,{xA:()=>s,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),f=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=f(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=f(r),d=l,g=p["".concat(i,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},s),{},{components:r})):n.createElement(g,a({ref:t},s))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:l,a[1]=c;for(var f=2;f{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>f});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller",id:"version-0.10/cli/fleet-controller/fleetcontroller",title:"",description:"fleetcontroller",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller",permalink:"/0.10/cli/fleet-controller/fleetcontroller",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.10/cli/fleet-cli/fleet_test"},next:{title:"fleetcontroller agentmanagement",permalink:"/0.10/cli/fleet-controller/fleetcontroller_agentmanagement"}},i={},f=[{value:"fleetcontroller",id:"fleetcontroller",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:f},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller"},"fleetcontroller"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-metrics disable metrics\n -h, --help help for fleetcontroller\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string namespace to watch (default \"cattle-fleet-system\")\n --shard-id string only manage resources labeled with a specific shard ID\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_agentmanagement"},"fleetcontroller agentmanagement"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_cleanup"},"fleetcontroller cleanup"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_gitjob"},"fleetcontroller gitjob"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3615],{5680:(e,t,r)=>{r.d(t,{xA:()=>s,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),f=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=f(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=f(r),d=l,g=p["".concat(i,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},s),{},{components:r})):n.createElement(g,a({ref:t},s))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:l,a[1]=c;for(var f=2;f{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>f});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller",id:"version-0.10/cli/fleet-controller/fleetcontroller",title:"",description:"fleetcontroller",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller",permalink:"/0.10/cli/fleet-controller/fleetcontroller",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.10/cli/fleet-cli/fleet_test"},next:{title:"fleetcontroller agentmanagement",permalink:"/0.10/cli/fleet-controller/fleetcontroller_agentmanagement"}},i={},f=[{value:"fleetcontroller",id:"fleetcontroller",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:f},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller"},"fleetcontroller"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-metrics disable metrics\n -h, --help help for fleetcontroller\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string namespace to watch (default \"cattle-fleet-system\")\n --shard-id string only manage resources labeled with a specific shard ID\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_agentmanagement"},"fleetcontroller agentmanagement"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_cleanup"},"fleetcontroller cleanup"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_gitjob"},"fleetcontroller gitjob"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/45a5cd1f.18b5f71f.js b/assets/js/45a5cd1f.18b5f71f.js deleted file mode 100644 index 24d8d34ab..000000000 --- a/assets/js/45a5cd1f.18b5f71f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4e3],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/docs/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/concepts.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/architecture"},next:{title:"Bundle Lifecycle",permalink:"/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/45a5cd1f.4d3cb70a.js b/assets/js/45a5cd1f.4d3cb70a.js new file mode 100644 index 000000000..08a52cdbb --- /dev/null +++ b/assets/js/45a5cd1f.4d3cb70a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4e3],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/docs/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/concepts.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/architecture"},next:{title:"Bundle Lifecycle",permalink:"/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/46c9c1f8.df7f92fb.js b/assets/js/46c9c1f8.408360fc.js similarity index 62% rename from assets/js/46c9c1f8.df7f92fb.js rename to assets/js/46c9c1f8.408360fc.js index dafd60310..96538e83d 100644 --- a/assets/js/46c9c1f8.df7f92fb.js +++ b/assets/js/46c9c1f8.408360fc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1091],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=a,g=p["".concat(l,".").concat(d)]||p[d]||f[d]||i;return r?n.createElement(g,o(o({ref:t},u),{},{components:r})):n.createElement(g,o({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},o="Cluster Registration Internals",s={unversionedId:"ref-registration",id:"version-0.6/ref-registration",title:"Cluster Registration Internals",description:"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.",source:"@site/versioned_docs/version-0.6/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.6/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-registration.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.6/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.6/ref-configuration"}},l={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...i}=e;return(0,a.yg)(p,(0,n.A)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.6/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.6/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})))}f.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1091],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=a,g=p["".concat(l,".").concat(d)]||p[d]||f[d]||i;return r?n.createElement(g,o(o({ref:t},u),{},{components:r})):n.createElement(g,o({ref:t},u))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>f,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const i={},o="Cluster Registration Internals",s={unversionedId:"ref-registration",id:"version-0.6/ref-registration",title:"Cluster Registration Internals",description:"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.",source:"@site/versioned_docs/version-0.6/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.6/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-registration.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle State",permalink:"/0.6/cluster-bundles-state"},next:{title:"Configuration",permalink:"/0.6/ref-configuration"}},l={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...i}=e;return(0,a.yg)(p,(0,n.A)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster.\nIt's important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.6/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.6/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})))}f.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"}}]); \ No newline at end of file diff --git a/assets/js/49af6a86.0467fbcc.js b/assets/js/49af6a86.0467fbcc.js new file mode 100644 index 000000000..76a6a72d9 --- /dev/null +++ b/assets/js/49af6a86.0467fbcc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7069],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,g=p["".concat(l,".").concat(d)]||p[d]||h[d]||o;return n?r.createElement(g,s(s({ref:t},u),{},{components:n})):r.createElement(g,s({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Architecture",i={unversionedId:"architecture",id:"version-0.4/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.4/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.4/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/architecture.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.4/concepts"},next:{title:"Examples",permalink:"/0.4/examples"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.4/manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."))}h.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/49af6a86.a7197f9f.js b/assets/js/49af6a86.a7197f9f.js deleted file mode 100644 index dd932dee6..000000000 --- a/assets/js/49af6a86.a7197f9f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7069],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,g=p["".concat(l,".").concat(d)]||p[d]||h[d]||o;return n?r.createElement(g,s(s({ref:t},u),{},{components:n})):r.createElement(g,s({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Architecture",i={unversionedId:"architecture",id:"version-0.4/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.4/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.4/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/architecture.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.4/concepts"},next:{title:"Examples",permalink:"/0.4/examples"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.4/manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."))}h.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/4ccb6852.262cc6a1.js b/assets/js/4ccb6852.6f82cf13.js similarity index 67% rename from assets/js/4ccb6852.262cc6a1.js rename to assets/js/4ccb6852.6f82cf13.js index 1f8178bbd..6cb71ff0f 100644 --- a/assets/js/4ccb6852.262cc6a1.js +++ b/assets/js/4ccb6852.6f82cf13.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9028],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},i="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),i=u(r),g=a,d=i["".concat(c,".").concat(g)]||i[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},p),{},{components:r})):n.createElement(d,s({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[i]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/docs/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cluster-group.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/cluster-registration"},next:{title:"Setup Multi User",permalink:"/multi-user"}},c={},u=[],p={toc:u},i="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(i,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9028],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},i="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),i=u(r),g=a,d=i["".concat(c,".").concat(g)]||i[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},p),{},{components:r})):n.createElement(d,s({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[i]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/docs/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cluster-group.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/cluster-registration"},next:{title:"Setup Multi User",permalink:"/multi-user"}},c={},u=[],p={toc:u},i="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(i,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4e63d43a.16c5ee57.js b/assets/js/4e63d43a.16c5ee57.js deleted file mode 100644 index cc9c3d9a9..000000000 --- a/assets/js/4e63d43a.16c5ee57.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6291],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>u});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(a),g=l,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||n;return a?r.createElement(u,o(o({ref:t},p),{},{components:a})):r.createElement(u,o({ref:t},p))}));function u(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.9.4",date:"2024-05-02 12:48:10 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.4",id:"version-0.9/changelogs/changelogs/v0.9.4",title:"v0.9.4",description:"(rancherio-gh-m) released this 2024-05-02 1210 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.4.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.4",permalink:"/0.9/changelogs/changelogs/v0.9.4",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.4.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.9.4",date:"2024-05-02 12:48:10 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.3",permalink:"/0.9/changelogs/changelogs/v0.9.3"},next:{title:"v0.9.5",permalink:"/0.9/changelogs/changelogs/v0.9.5"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},d="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-05-02 12:48:10 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump github.com/hashicorp/go-getter to v1.7.4 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2256449008","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2350","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2350/hovercard",href:"https://github.com/rancher/fleet/pull/2350"},"#2350")),(0,l.yg)("li",null,"Bump golang.org/x/net to v0.23.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268170759","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2384","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2384/hovercard",href:"https://github.com/rancher/fleet/pull/2384"},"#2384")),(0,l.yg)("li",null,"Bump gitjob to 0.9.7 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268173378","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2385","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2385/hovercard",href:"https://github.com/rancher/fleet/pull/2385"},"#2385"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.3...v0.9.4"},(0,l.yg)("tt",null,"v0.9.3...v0.9.4"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-crd-0.9.4.tgz"},"fleet-crd-0.9.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-agent-0.9.4.tgz"},"fleet-agent-0.9.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-0.9.4.tgz"},"fleet-0.9.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.4"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4e63d43a.3d28a661.js b/assets/js/4e63d43a.3d28a661.js new file mode 100644 index 000000000..858c125ae --- /dev/null +++ b/assets/js/4e63d43a.3d28a661.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6291],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>u});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(a),g=l,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||n;return a?r.createElement(u,o(o({ref:t},p),{},{components:a})):r.createElement(u,o({ref:t},p))}));function u(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.9.4",date:"2024-05-02 12:48:10 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.4",id:"version-0.9/changelogs/changelogs/v0.9.4",title:"v0.9.4",description:"(rancherio-gh-m) released this 2024-05-02 1210 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.4.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.4",permalink:"/0.9/changelogs/changelogs/v0.9.4",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.4.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.9.4",date:"2024-05-02 12:48:10 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.3",permalink:"/0.9/changelogs/changelogs/v0.9.3"},next:{title:"v0.9.5",permalink:"/0.9/changelogs/changelogs/v0.9.5"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},d="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-05-02 12:48:10 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump github.com/hashicorp/go-getter to v1.7.4 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2256449008","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2350","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2350/hovercard",href:"https://github.com/rancher/fleet/pull/2350"},"#2350")),(0,l.yg)("li",null,"Bump golang.org/x/net to v0.23.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268170759","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2384","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2384/hovercard",href:"https://github.com/rancher/fleet/pull/2384"},"#2384")),(0,l.yg)("li",null,"Bump gitjob to 0.9.7 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268173378","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2385","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2385/hovercard",href:"https://github.com/rancher/fleet/pull/2385"},"#2385"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.3...v0.9.4"},(0,l.yg)("tt",null,"v0.9.3...v0.9.4"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-crd-0.9.4.tgz"},"fleet-crd-0.9.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-agent-0.9.4.tgz"},"fleet-agent-0.9.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-0.9.4.tgz"},"fleet-0.9.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.4/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.4"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4fac8f87.bb392bce.js b/assets/js/4fac8f87.bb392bce.js new file mode 100644 index 000000000..00fd1af03 --- /dev/null +++ b/assets/js/4fac8f87.bb392bce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9752],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=a,y=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:a,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Quick Start",i={unversionedId:"quickstart",id:"version-0.4/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.4/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.4/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/quickstart.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.4/"},next:{title:"Core Concepts",permalink:"/0.4/concepts"}},s={},c=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"quick-start"},"Quick Start"),(0,a.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,a.yg)("h2",{id:"install"},"Install"),(0,a.yg)("p",null,"Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure\nthings to your cluster."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,a.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-v0.4.1.tgz\nhelm -n cattle-fleet-system install --create-namespace --wait \\\n fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-v0.4.1.tgz\n")),(0,a.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to watch"),(0,a.yg)("p",null,"Change ",(0,a.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,a.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,a.yg)("h2",{id:"get-status"},"Get Status"),(0,a.yg)("p",null,"Get status of what fleet is doing"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,a.yg)("p",null,"You should see something like this get created in your cluster."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,a.yg)("p",null,"Enjoy and read the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4fac8f87.ea7b58d9.js b/assets/js/4fac8f87.ea7b58d9.js deleted file mode 100644 index 01cc10246..000000000 --- a/assets/js/4fac8f87.ea7b58d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9752],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=a,y=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:a,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Quick Start",i={unversionedId:"quickstart",id:"version-0.4/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.4/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.4/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/quickstart.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.4/"},next:{title:"Core Concepts",permalink:"/0.4/concepts"}},s={},c=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"quick-start"},"Quick Start"),(0,a.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,a.yg)("h2",{id:"install"},"Install"),(0,a.yg)("p",null,"Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure\nthings to your cluster."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,a.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-v0.4.1.tgz\nhelm -n cattle-fleet-system install --create-namespace --wait \\\n fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-v0.4.1.tgz\n")),(0,a.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to watch"),(0,a.yg)("p",null,"Change ",(0,a.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,a.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,a.yg)("h2",{id:"get-status"},"Get Status"),(0,a.yg)("p",null,"Get status of what fleet is doing"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,a.yg)("p",null,"You should see something like this get created in your cluster."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,a.yg)("p",null,"Enjoy and read the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/504a9fc5.b23a2dff.js b/assets/js/504a9fc5.b23a2dff.js new file mode 100644 index 000000000..0d032e1d6 --- /dev/null +++ b/assets/js/504a9fc5.b23a2dff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7248],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.8/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.8/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.8/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/concepts.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.8/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.8/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.8/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.8/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.8/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/504a9fc5.c559205d.js b/assets/js/504a9fc5.c559205d.js deleted file mode 100644 index 2d359f6c6..000000000 --- a/assets/js/504a9fc5.c559205d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7248],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.8/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.8/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.8/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/concepts.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.8/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.8/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.8/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.8/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.8/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/50b0676a.d516f147.js b/assets/js/50b0676a.d516f147.js new file mode 100644 index 000000000..1f524343f --- /dev/null +++ b/assets/js/50b0676a.d516f147.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6452],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.8/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.8/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.8/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-cli/fleet_test.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.8/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.8/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5176c92e.dede99c9.js b/assets/js/5176c92e.4c30a87c.js similarity index 73% rename from assets/js/5176c92e.dede99c9.js rename to assets/js/5176c92e.4c30a87c.js index 62057eae1..b3f867b08 100644 --- a/assets/js/5176c92e.dede99c9.js +++ b/assets/js/5176c92e.4c30a87c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3525],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.7/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.7/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.7/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/uninstall.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.7/tut-deployment"},next:{title:"Architecture",permalink:"/0.7/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3525],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.7/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.7/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.7/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/uninstall.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.7/tut-deployment"},next:{title:"Architecture",permalink:"/0.7/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/522d95f1.81b01479.js b/assets/js/522d95f1.81b01479.js deleted file mode 100644 index 7254f1d03..000000000 --- a/assets/js/522d95f1.81b01479.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5413],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var o=r.createContext({}),c=function(e){var t=r.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(o.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,o=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=l,g=p["".concat(o,".").concat(d)]||p[d]||m[d]||a;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[p]="string"==typeof e?e:l,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},i="Multi-cluster Install",s={unversionedId:"multi-cluster-install",id:"version-0.4/multi-cluster-install",title:"Multi-cluster Install",description:"Note: Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under Continuous Delivery on Rancher.",source:"@site/versioned_docs/version-0.4/multi-cluster-install.md",sourceDirName:".",slug:"/multi-cluster-install",permalink:"/0.4/multi-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/multi-cluster-install.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Single Cluster Install",permalink:"/0.4/single-cluster-install"},next:{title:"Uninstall",permalink:"/0.4/uninstall"}},o={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:2},{value:"Install",id:"install",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...a}=e;return(0,l.yg)(p,(0,r.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"multi-cluster-install"},"Multi-cluster Install"),(0,l.yg)("p",null,(0,l.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"Note:")," Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"Warning:")," The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA. "),(0,l.yg)("p",null,"In the below use case, you will setup a centralized Fleet manager. The centralized Fleet manager is a\nKubernetes cluster running the Fleet controllers. After installing the Fleet manager, you will then\nneed to register remote downstream clusters with the Fleet manager."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)("h3",{id:"helm-3"},"Helm 3"),(0,l.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,l.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,l.yg)("p",null,"macOS"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,l.yg)("p",null,"Windows"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,l.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,l.yg)("p",null,"The Fleet manager is a controller running on a Kubernetes cluster so an existing cluster is required. All\ndownstream cluster that will be managed will need to communicate to this central Kubernetes cluster. This\nmeans the Kubernetes API server URL must be accessible to the downstream clusters. Any Kubernetes community\nsupported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,l.yg)("h2",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"If you have ",(0,l.yg)("inlineCode",{parentName:"p"},"jq")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"base64")," available then this one-liners will pull all CA certificates from your\n",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," and place then in a file named ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),"."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n")),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Run the following commands"),(0,l.yg)("p",null,"Setup the environment with your specific values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fLk ${API_SERVER_URL}/version\n")),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},"--cacert ${API_SERVER_CA}")," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fL --cacert ${API_SERVER_CA} ${API_SERVER_URL}/version\n")),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"${API_SERVER_CA}")," file should look similar to the below"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz\n")),(0,l.yg)("p",null,"Second install the Fleet controllers."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="${API_SERVER_URL}" \\\n --set-file apiServerCA="${API_SERVER_CA}" \\\n fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz\n')),(0,l.yg)("p",null,"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-overview"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.4/gitrepo-add"},"git repos")," with\nthe Fleet manager."))}m.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/522d95f1.cebf3b17.js b/assets/js/522d95f1.cebf3b17.js new file mode 100644 index 000000000..6ddd9fd5a --- /dev/null +++ b/assets/js/522d95f1.cebf3b17.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5413],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var o=r.createContext({}),c=function(e){var t=r.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(o.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,o=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=l,g=p["".concat(o,".").concat(d)]||p[d]||m[d]||a;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[p]="string"==typeof e?e:l,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},i="Multi-cluster Install",s={unversionedId:"multi-cluster-install",id:"version-0.4/multi-cluster-install",title:"Multi-cluster Install",description:"Note: Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under Continuous Delivery on Rancher.",source:"@site/versioned_docs/version-0.4/multi-cluster-install.md",sourceDirName:".",slug:"/multi-cluster-install",permalink:"/0.4/multi-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/multi-cluster-install.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Single Cluster Install",permalink:"/0.4/single-cluster-install"},next:{title:"Uninstall",permalink:"/0.4/uninstall"}},o={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:2},{value:"Install",id:"install",level:2}],u={toc:c},p="wrapper";function m(e){let{components:t,...a}=e;return(0,l.yg)(p,(0,r.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"multi-cluster-install"},"Multi-cluster Install"),(0,l.yg)("p",null,(0,l.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"Note:")," Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"Warning:")," The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA. "),(0,l.yg)("p",null,"In the below use case, you will setup a centralized Fleet manager. The centralized Fleet manager is a\nKubernetes cluster running the Fleet controllers. After installing the Fleet manager, you will then\nneed to register remote downstream clusters with the Fleet manager."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)("h3",{id:"helm-3"},"Helm 3"),(0,l.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,l.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,l.yg)("p",null,"macOS"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,l.yg)("p",null,"Windows"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,l.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,l.yg)("p",null,"The Fleet manager is a controller running on a Kubernetes cluster so an existing cluster is required. All\ndownstream cluster that will be managed will need to communicate to this central Kubernetes cluster. This\nmeans the Kubernetes API server URL must be accessible to the downstream clusters. Any Kubernetes community\nsupported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,l.yg)("h2",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"If you have ",(0,l.yg)("inlineCode",{parentName:"p"},"jq")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"base64")," available then this one-liners will pull all CA certificates from your\n",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," and place then in a file named ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),"."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n")),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Run the following commands"),(0,l.yg)("p",null,"Setup the environment with your specific values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fLk ${API_SERVER_URL}/version\n")),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},"--cacert ${API_SERVER_CA}")," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"curl -fL --cacert ${API_SERVER_CA} ${API_SERVER_URL}/version\n")),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"${API_SERVER_CA}")," file should look similar to the below"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz\n")),(0,l.yg)("p",null,"Second install the Fleet controllers."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="${API_SERVER_URL}" \\\n --set-file apiServerCA="${API_SERVER_CA}" \\\n fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz\n')),(0,l.yg)("p",null,"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-overview"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.4/gitrepo-add"},"git repos")," with\nthe Fleet manager."))}m.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/5281b7a2.14df710b.js b/assets/js/5281b7a2.14df710b.js deleted file mode 100644 index f205a360e..000000000 --- a/assets/js/5281b7a2.14df710b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2443],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=o,m=p["".concat(s,".").concat(d)]||p[d]||h[d]||l;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Architecture",i={unversionedId:"architecture",id:"architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet controller and the cluster agents. These",source:"@site/docs/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/architecture.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/uninstall"},next:{title:"Core Concepts",permalink:"/concepts"}},s={},c=[{value:"Fleet Controller",id:"fleet-controller",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...l}=e;return(0,o.yg)(p,(0,r.A)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"architecture"},"Architecture"),(0,o.yg)("p",null,"Fleet has two primary components. The Fleet controller and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet controller will pull from git and the\ncluster agents will pull from the Fleet controller."),(0,o.yg)("h2",{id:"fleet-controller"},"Fleet Controller"),(0,o.yg)("p",null,"The Fleet controller is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet controller is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,o.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,o.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet controller.\nThe only communication from cluster to Fleet controller is by this agent and all communication\ngoes from the managed cluster to the Fleet controller. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet controller. The one exception to this is if you use\nthe ",(0,o.yg)("a",{parentName:"p",href:"/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,o.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,o.yg)("h2",{id:"security"},"Security"),(0,o.yg)("p",null,'The Fleet controller dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,o.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,o.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,o.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,o.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,o.yg)("h2",{id:"component-overview"},"Component Overview"),(0,o.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/5281b7a2.7b04cf3e.js b/assets/js/5281b7a2.7b04cf3e.js new file mode 100644 index 000000000..d5e3938ef --- /dev/null +++ b/assets/js/5281b7a2.7b04cf3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2443],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=o,m=p["".concat(s,".").concat(d)]||p[d]||h[d]||l;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Architecture",i={unversionedId:"architecture",id:"architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet controller and the cluster agents. These",source:"@site/docs/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/architecture.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/uninstall"},next:{title:"Core Concepts",permalink:"/concepts"}},s={},c=[{value:"Fleet Controller",id:"fleet-controller",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...l}=e;return(0,o.yg)(p,(0,r.A)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"architecture"},"Architecture"),(0,o.yg)("p",null,"Fleet has two primary components. The Fleet controller and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet controller will pull from git and the\ncluster agents will pull from the Fleet controller."),(0,o.yg)("h2",{id:"fleet-controller"},"Fleet Controller"),(0,o.yg)("p",null,"The Fleet controller is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet controller is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,o.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,o.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet controller.\nThe only communication from cluster to Fleet controller is by this agent and all communication\ngoes from the managed cluster to the Fleet controller. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet controller. The one exception to this is if you use\nthe ",(0,o.yg)("a",{parentName:"p",href:"/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,o.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,o.yg)("h2",{id:"security"},"Security"),(0,o.yg)("p",null,'The Fleet controller dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,o.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,o.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,o.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,o.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,o.yg)("h2",{id:"component-overview"},"Component Overview"),(0,o.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/5379b7b3.41859903.js b/assets/js/5379b7b3.41859903.js deleted file mode 100644 index 4c5ef4838..000000000 --- a/assets/js/5379b7b3.41859903.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7275],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>m});var n=r(6540);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=i,m=p["".concat(l,".").concat(d)]||p[d]||g[d]||a;return r?n.createElement(m,o(o({ref:t},u),{},{components:r})):n.createElement(m,o({ref:t},u))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:i,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(8168),i=(r(6540),r(5680));const a={},o="Overview",s={unversionedId:"cluster-overview",id:"version-0.5/cluster-overview",title:"Overview",description:"There are two specific styles to registering clusters. These styles will be referred",source:"@site/versioned_docs/version-0.5/cluster-overview.md",sourceDirName:".",slug:"/cluster-overview",permalink:"/0.5/cluster-overview",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-overview.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Examples",permalink:"/0.5/examples"},next:{title:"Cluster Registration Tokens",permalink:"/0.5/cluster-tokens"}},l={},c=[{value:"Agent Initiated Registration",id:"agent-initiated-registration",level:2},{value:"Manager Initiated Registration",id:"manager-initiated-registration",level:2}],u={toc:c},p="wrapper";function g(e){let{components:t,...r}=e;return(0,i.yg)(p,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.yg)("h1",{id:"overview"},"Overview"),(0,i.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,i.yg)("strong",{parentName:"p"},"agent initiated")," and ",(0,i.yg)("strong",{parentName:"p"},"manager initiated")," registration. Typically one would\ngo with the agent initiated registration but there are specific use cases in which\nmanager initiated is a better workflow."),(0,i.yg)("h2",{id:"agent-initiated-registration"},"Agent Initiated Registration"),(0,i.yg)("p",null,"Agent initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,i.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,i.yg)("h2",{id:"manager-initiated-registration"},"Manager Initiated Registration"),(0,i.yg)("p",null,"Manager initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f6748474.8410cf7d.js b/assets/js/5379b7b3.d4faf8db.js similarity index 82% rename from assets/js/f6748474.8410cf7d.js rename to assets/js/5379b7b3.d4faf8db.js index dc2b08d09..fea932d77 100644 --- a/assets/js/f6748474.8410cf7d.js +++ b/assets/js/5379b7b3.d4faf8db.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3747],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>m});var n=r(6540);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=i,m=p["".concat(l,".").concat(d)]||p[d]||g[d]||a;return r?n.createElement(m,o(o({ref:t},u),{},{components:r})):n.createElement(m,o({ref:t},u))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:i,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(8168),i=(r(6540),r(5680));const a={},o="Overview",s={unversionedId:"cluster-overview",id:"version-0.4/cluster-overview",title:"Overview",description:"There are two specific styles to registering clusters. These styles will be referred",source:"@site/versioned_docs/version-0.4/cluster-overview.md",sourceDirName:".",slug:"/cluster-overview",permalink:"/0.4/cluster-overview",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-overview.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Examples",permalink:"/0.4/examples"},next:{title:"Cluster Registration Tokens",permalink:"/0.4/cluster-tokens"}},l={},c=[{value:"Agent Initiated Registration",id:"agent-initiated-registration",level:2},{value:"Manager Initiated Registration",id:"manager-initiated-registration",level:2}],u={toc:c},p="wrapper";function g(e){let{components:t,...r}=e;return(0,i.yg)(p,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.yg)("h1",{id:"overview"},"Overview"),(0,i.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,i.yg)("strong",{parentName:"p"},"agent initiated")," and ",(0,i.yg)("strong",{parentName:"p"},"manager initiated")," registration. Typically one would\ngo with the agent initiated registration but there are specific use cases in which\nmanager initiated is a better workflow."),(0,i.yg)("h2",{id:"agent-initiated-registration"},"Agent Initiated Registration"),(0,i.yg)("p",null,"Agent initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,i.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,i.yg)("h2",{id:"manager-initiated-registration"},"Manager Initiated Registration"),(0,i.yg)("p",null,"Manager initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7275],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>m});var n=r(6540);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=i,m=p["".concat(l,".").concat(d)]||p[d]||g[d]||a;return r?n.createElement(m,o(o({ref:t},u),{},{components:r})):n.createElement(m,o({ref:t},u))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:i,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(8168),i=(r(6540),r(5680));const a={},o="Overview",s={unversionedId:"cluster-overview",id:"version-0.5/cluster-overview",title:"Overview",description:"There are two specific styles to registering clusters. These styles will be referred",source:"@site/versioned_docs/version-0.5/cluster-overview.md",sourceDirName:".",slug:"/cluster-overview",permalink:"/0.5/cluster-overview",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-overview.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Examples",permalink:"/0.5/examples"},next:{title:"Cluster Registration Tokens",permalink:"/0.5/cluster-tokens"}},l={},c=[{value:"Agent Initiated Registration",id:"agent-initiated-registration",level:2},{value:"Manager Initiated Registration",id:"manager-initiated-registration",level:2}],u={toc:c},p="wrapper";function g(e){let{components:t,...r}=e;return(0,i.yg)(p,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.yg)("h1",{id:"overview"},"Overview"),(0,i.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,i.yg)("strong",{parentName:"p"},"agent initiated")," and ",(0,i.yg)("strong",{parentName:"p"},"manager initiated")," registration. Typically one would\ngo with the agent initiated registration but there are specific use cases in which\nmanager initiated is a better workflow."),(0,i.yg)("h2",{id:"agent-initiated-registration"},"Agent Initiated Registration"),(0,i.yg)("p",null,"Agent initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,i.yg)("a",{parentName:"p",href:"/0.5/cluster-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,i.yg)("h2",{id:"manager-initiated-registration"},"Manager Initiated Registration"),(0,i.yg)("p",null,"Manager initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5388fcb8.f6eab35b.js b/assets/js/5388fcb8.280ab3c3.js similarity index 79% rename from assets/js/5388fcb8.f6eab35b.js rename to assets/js/5388fcb8.280ab3c3.js index 1311d8538..e68f8761a 100644 --- a/assets/js/5388fcb8.f6eab35b.js +++ b/assets/js/5388fcb8.280ab3c3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2648],{5680:(e,r,t)=>{t.d(r,{xA:()=>u,yg:()=>m});var n=t(6540);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function s(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=n.createContext({}),l=function(e){var r=n.useContext(i),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=l(e.components);return n.createElement(i.Provider,{value:r},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,s=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(t),d=o,m=p["".concat(i,".").concat(d)]||p[d]||f[d]||s;return t?n.createElement(m,a(a({ref:r},u),{},{components:t})):n.createElement(m,a({ref:r},u))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var s=t.length,a=new Array(s);a[0]=d;var c={};for(var i in r)hasOwnProperty.call(r,i)&&(c[i]=r[i]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{t.r(r),t.d(r,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var n=t(8168),o=(t(6540),t(5680));const s={},a="Custom Resources",c={unversionedId:"ref-resources",id:"version-0.7/ref-resources",title:"Custom Resources",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.7/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.7/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-resources.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.7/namespaces"},next:{title:"Installation Details",permalink:"/0.7/installation"}},i={},l=[],u={toc:l},p="wrapper";function f(e){let{components:r,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:r,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources"},"Custom Resources"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:t(4467).A,width:"831",height:"1341"})))}f.isMDXComponent=!0},4467:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2648],{5680:(e,r,t)=>{t.d(r,{xA:()=>u,yg:()=>m});var n=t(6540);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function s(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=n.createContext({}),l=function(e){var r=n.useContext(i),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=l(e.components);return n.createElement(i.Provider,{value:r},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,s=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(t),d=o,m=p["".concat(i,".").concat(d)]||p[d]||f[d]||s;return t?n.createElement(m,a(a({ref:r},u),{},{components:t})):n.createElement(m,a({ref:r},u))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var s=t.length,a=new Array(s);a[0]=d;var c={};for(var i in r)hasOwnProperty.call(r,i)&&(c[i]=r[i]);c.originalType=e,c[p]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{t.r(r),t.d(r,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var n=t(8168),o=(t(6540),t(5680));const s={},a="Custom Resources",c={unversionedId:"ref-resources",id:"version-0.7/ref-resources",title:"Custom Resources",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.7/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.7/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-resources.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.7/namespaces"},next:{title:"Installation Details",permalink:"/0.7/installation"}},i={},l=[],u={toc:l},p="wrapper";function f(e){let{components:r,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:r,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources"},"Custom Resources"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:t(4467).A,width:"831",height:"1341"})))}f.isMDXComponent=!0},4467:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file diff --git a/assets/js/53c8b813.69e29473.js b/assets/js/53c8b813.69e29473.js new file mode 100644 index 000000000..ec1b4750c --- /dev/null +++ b/assets/js/53c8b813.69e29473.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8568],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.6/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.6/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.6/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-bundle-stages.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.6/concepts"},next:{title:"Git Repository Contents",permalink:"/0.6/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.6/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.6/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.6/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/53c8b813.9f3df9bb.js b/assets/js/53c8b813.9f3df9bb.js deleted file mode 100644 index 22408ec9c..000000000 --- a/assets/js/53c8b813.9f3df9bb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8568],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.6/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.6/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.6/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-bundle-stages.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.6/concepts"},next:{title:"Git Repository Contents",permalink:"/0.6/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.6/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.6/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.6/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/53da1243.441d4d38.js b/assets/js/53da1243.441d4d38.js new file mode 100644 index 000000000..349d7b355 --- /dev/null +++ b/assets/js/53da1243.441d4d38.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6652],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.8/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.8/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.8/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/namespaces.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.8/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/0.8/resources-during-deployment"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.8/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.8/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("p",null,"The cluster registration namespace contains the cluster and the clusterregistration resources, as well as any gitrepos and bundles."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/568472e2.acdc066b.js b/assets/js/568472e2.27a189ed.js similarity index 67% rename from assets/js/568472e2.acdc066b.js rename to assets/js/568472e2.27a189ed.js index 5e29324ea..c5d580899 100644 --- a/assets/js/568472e2.acdc066b.js +++ b/assets/js/568472e2.27a189ed.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[984],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.10/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.10/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.10/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cluster-group.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.10/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.10/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[984],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.10/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.10/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.10/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cluster-group.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.10/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.10/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/579c3ff9.cd359614.js b/assets/js/579c3ff9.c6c84f1e.js similarity index 55% rename from assets/js/579c3ff9.cd359614.js rename to assets/js/579c3ff9.c6c84f1e.js index 826cbfd72..dc6555fda 100644 --- a/assets/js/579c3ff9.cd359614.js +++ b/assets/js/579c3ff9.c6c84f1e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8607],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=a(e,["components","mdxType","originalType","parentName"]),d=s(r),u=l,g=d["".concat(c,".").concat(u)]||d[u]||p[u]||o;return r?n.createElement(g,i(i({ref:t},f),{},{components:r})):n.createElement(g,i({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,i=new Array(o);i[0]=u;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[d]="string"==typeof e?e:l,i[1]=a;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller gitjob"},i=void 0,a={unversionedId:"cli/fleet-controller/fleetcontroller_gitjob",id:"cli/fleet-controller/fleetcontroller_gitjob",title:"",description:"fleetcontroller gitjob",source:"@site/docs/cli/fleet-controller/fleetcontroller_gitjob.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_gitjob",permalink:"/cli/fleet-controller/fleetcontroller_gitjob",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller_gitjob.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller gitjob"},sidebar:"docs",previous:{title:"fleetcontroller cleanup",permalink:"/cli/fleet-controller/fleetcontroller_cleanup"},next:{title:"Status Fields",permalink:"/ref-status-fields"}},c={},s=[{value:"fleetcontroller gitjob",id:"fleetcontroller-gitjob",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},d="wrapper";function p(e){let{components:t,...r}=e;return(0,l.yg)(d,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-gitjob"},"fleetcontroller gitjob"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller gitjob [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")\n -h, --help help for gitjob\n --kubeconfig string Kubeconfig file\n --leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.\n --listen string The port the webhook listens. (default ":8080")\n --metrics-bind-address string The address the metric endpoint binds to. (default ":8081")\n --namespace string namespace to watch (default "cattle-fleet-system")\n --shard-node-selector string node selector to apply to jobs based on the shard ID, if any\n')),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --disable-metrics disable metrics\n --shard-id string only manage resources labeled with a specific shard ID\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8607],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=a(e,["components","mdxType","originalType","parentName"]),d=s(r),u=l,g=d["".concat(c,".").concat(u)]||d[u]||p[u]||o;return r?n.createElement(g,i(i({ref:t},f),{},{components:r})):n.createElement(g,i({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,i=new Array(o);i[0]=u;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[d]="string"==typeof e?e:l,i[1]=a;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller gitjob"},i=void 0,a={unversionedId:"cli/fleet-controller/fleetcontroller_gitjob",id:"cli/fleet-controller/fleetcontroller_gitjob",title:"",description:"fleetcontroller gitjob",source:"@site/docs/cli/fleet-controller/fleetcontroller_gitjob.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_gitjob",permalink:"/cli/fleet-controller/fleetcontroller_gitjob",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller_gitjob.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller gitjob"},sidebar:"docs",previous:{title:"fleetcontroller cleanup",permalink:"/cli/fleet-controller/fleetcontroller_cleanup"},next:{title:"Status Fields",permalink:"/ref-status-fields"}},c={},s=[{value:"fleetcontroller gitjob",id:"fleetcontroller-gitjob",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},d="wrapper";function p(e){let{components:t,...r}=e;return(0,l.yg)(d,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-gitjob"},"fleetcontroller gitjob"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller gitjob [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")\n -h, --help help for gitjob\n --kubeconfig string Kubeconfig file\n --leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.\n --listen string The port the webhook listens. (default ":8080")\n --metrics-bind-address string The address the metric endpoint binds to. (default ":8081")\n --namespace string namespace to watch (default "cattle-fleet-system")\n --shard-node-selector string node selector to apply to jobs based on the shard ID, if any\n')),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --disable-metrics disable metrics\n --shard-id string only manage resources labeled with a specific shard ID\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/59785b52.1998055a.js b/assets/js/59785b52.1998055a.js deleted file mode 100644 index 4b535d3d8..000000000 --- a/assets/js/59785b52.1998055a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7200],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>A});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),c=a(1682),u=a(9466);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,c]=m({queryString:a,groupId:l}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,u.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),y=(()=>{const e=i??d;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{y&&o(y)}),[y]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,r]),tabValues:r}}var y=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=u.indexOf(t),l=c[a].value;l!==o&&(d(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=u.indexOf(e.currentTarget)+1;t=u[a]??u[0];break}case"ArrowLeft":{const a=u.indexOf(e.currentTarget)-1;t=u[a]??u[u.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},c.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>u.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=g(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function A(e){const t=(0,y.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},6081:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var l=a(8168),n=(a(6540),a(5680)),r=a(7858),s=a(2355),o=a(1470),i=a(9365);const c={},u="Installation Details",d={unversionedId:"installation",id:"version-0.10/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.10/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.10/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/installation.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/0.10/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/0.10/cluster-registration"}},p={},h=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Multi-controller install: sharding",id:"multi-controller-install-sharding",level:2},{value:"Deployment",id:"deployment",level:3},{value:"How it works",id:"how-it-works",level:3},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],m={toc:h},g="wrapper";function y(e){let{components:t,...c}=e;return(0,n.yg)(g,(0,l.A)({},m,c,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"installation-details"},"Installation Details"),(0,n.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,n.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,n.yg)("p",null,(0,n.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,n.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,n.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,n.yg)(i.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,n.yg)("h2",{id:"default-install"},"Default Install"),(0,n.yg)("p",null,"Install the following two Helm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,n.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,n.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,n.yg)("p",null,"First add Fleet's Helm repository."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,n.yg)(i.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,n.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"You can now ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add"},"register some git repos")," in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,n.yg)("h2",{id:"multi-controller-install-sharding"},"Multi-controller install: sharding"),(0,n.yg)("h3",{id:"deployment"},"Deployment"),(0,n.yg)("p",null,"From 0.10 onwards, Fleet supports static sharding.\nEach shard is defined by its shard ID.\nOptionally, a shard can have a ",(0,n.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector"},"node\nselector"),", instructing Fleet to\ncreate all controller pods and jobs for that shard on nodes matching that selector."),(0,n.yg)("p",null,"The Fleet controller chart can be installed with the following arguments:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].id=$shard_id")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].nodeSelector.$key=$value"))),(0,n.yg)("p",null,"This will result in:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"as many Fleet controller and gitjob deployments as specified unique shard IDs,"),(0,n.yg)("li",{parentName:"ul"},"plus the usual unsharded Fleet controller pod. That latter pod will be the only one containing agent management and\ncleanup containers.")),(0,n.yg)("p",null,"For instance:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'$ helm -n cattle-fleet-system install --create-namespace --wait fleet fleet/fleet \\\n --set shards[0].id=foo \\\n --set shards[0].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-0 \\\n --set shards[1].id=bar \\\n --set shards[1].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-1 \\\n --set shards[2].id=baz \\\n --set shards[2].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-2 \\\n\n$ kubectl -n cattle-fleet-system get pods -l app=fleet-controller \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\nfleet-controller-b4c469c85-rj2q8 k3d-upstream-server-2\nfleet-controller-shard-bar-5f5999958f-nt4bm bar k3d-upstream-server-1\nfleet-controller-shard-baz-75c8587898-2wkk9 baz k3d-upstream-server-2\nfleet-controller-shard-foo-55478fb9d8-42q2f foo k3d-upstream-server-0\n\n$ kubectl -n cattle-fleet-system get pods -l app=gitjob \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\ngitjob-8498c6d78b-mdhgh k3d-upstream-server-1\ngitjob-shard-bar-8659ffc945-9vtlx bar k3d-upstream-server-1\ngitjob-shard-baz-6d67f596dc-fsz9m baz k3d-upstream-server-2\ngitjob-shard-foo-8697bb7f67-wzsfj foo k3d-upstream-server-0\n')),(0,n.yg)("h3",{id:"how-it-works"},"How it works"),(0,n.yg)("p",null,"With sharding in place, each Fleet controller will process resources bearing its own shard ID. This also holds for the\nunsharded controller, which has no set shard ID and will therefore process all unsharded resources."),(0,n.yg)("p",null,"To deploy a GitRepo for a specific shard, simply add label ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.cattle.io/shard-ref")," with your desired shard ID as a\nvalue.\nHere is an example:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"$ kubectl apply -n fleet-local -f - < ca.pem\n")),(0,n.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,n.yg)(i.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,n.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,n.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("h4",{id:"validate"},"Validate"),(0,n.yg)("p",null,"First validate the server URL is correct."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,n.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,n.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"If you get a valid JSON response or an ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,n.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,n.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,n.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,n.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,n.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,n.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,n.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,n.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,n.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,n.yg)(i.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,n.yg)("a",{parentName:"p",href:"/0.10/cluster-registration"},"register clusters")," and ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}y.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>l});const l=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/59785b52.25c1f12a.js b/assets/js/59785b52.25c1f12a.js new file mode 100644 index 000000000..3efd660a7 --- /dev/null +++ b/assets/js/59785b52.25c1f12a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7200],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>A});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),c=a(1682),u=a(9466);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,c.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function g(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,c]=m({queryString:a,groupId:l}),[d,g]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,u.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),y=(()=>{const e=i??d;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{y&&o(y)}),[y]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),c(e),g(e)}),[c,g,r]),tabValues:r}}var y=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:c}=e;const u=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=u.indexOf(t),l=c[a].value;l!==o&&(d(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=u.indexOf(e.currentTarget)+1;t=u[a]??u[0];break}case"ArrowLeft":{const a=u.indexOf(e.currentTarget)-1;t=u[a]??u[u.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},c.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>u.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=g(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function A(e){const t=(0,y.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},6081:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>c,metadata:()=>d,toc:()=>h});var l=a(8168),n=(a(6540),a(5680)),r=a(7858),s=a(2355),o=a(1470),i=a(9365);const c={},u="Installation Details",d={unversionedId:"installation",id:"version-0.10/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.10/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.10/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/installation.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/0.10/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/0.10/cluster-registration"}},p={},h=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Multi-controller install: sharding",id:"multi-controller-install-sharding",level:2},{value:"Deployment",id:"deployment",level:3},{value:"How it works",id:"how-it-works",level:3},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],m={toc:h},g="wrapper";function y(e){let{components:t,...c}=e;return(0,n.yg)(g,(0,l.A)({},m,c,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"installation-details"},"Installation Details"),(0,n.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,n.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,n.yg)("p",null,(0,n.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,n.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,n.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,n.yg)(i.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,n.yg)("h2",{id:"default-install"},"Default Install"),(0,n.yg)("p",null,"Install the following two Helm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,n.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,n.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,n.yg)("p",null,"First add Fleet's Helm repository."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,n.yg)(i.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,n.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"You can now ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add"},"register some git repos")," in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,n.yg)("h2",{id:"multi-controller-install-sharding"},"Multi-controller install: sharding"),(0,n.yg)("h3",{id:"deployment"},"Deployment"),(0,n.yg)("p",null,"From 0.10 onwards, Fleet supports static sharding.\nEach shard is defined by its shard ID.\nOptionally, a shard can have a ",(0,n.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector"},"node\nselector"),", instructing Fleet to\ncreate all controller pods and jobs for that shard on nodes matching that selector."),(0,n.yg)("p",null,"The Fleet controller chart can be installed with the following arguments:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].id=$shard_id")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"--set shards[$index].nodeSelector.$key=$value"))),(0,n.yg)("p",null,"This will result in:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"as many Fleet controller and gitjob deployments as specified unique shard IDs,"),(0,n.yg)("li",{parentName:"ul"},"plus the usual unsharded Fleet controller pod. That latter pod will be the only one containing agent management and\ncleanup containers.")),(0,n.yg)("p",null,"For instance:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'$ helm -n cattle-fleet-system install --create-namespace --wait fleet fleet/fleet \\\n --set shards[0].id=foo \\\n --set shards[0].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-0 \\\n --set shards[1].id=bar \\\n --set shards[1].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-1 \\\n --set shards[2].id=baz \\\n --set shards[2].nodeSelector."kubernetes\\.io/hostname"=k3d-upstream-server-2 \\\n\n$ kubectl -n cattle-fleet-system get pods -l app=fleet-controller \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\nfleet-controller-b4c469c85-rj2q8 k3d-upstream-server-2\nfleet-controller-shard-bar-5f5999958f-nt4bm bar k3d-upstream-server-1\nfleet-controller-shard-baz-75c8587898-2wkk9 baz k3d-upstream-server-2\nfleet-controller-shard-foo-55478fb9d8-42q2f foo k3d-upstream-server-0\n\n$ kubectl -n cattle-fleet-system get pods -l app=gitjob \\\n -o=custom-columns=\'Name:.metadata.name,Shard-ID:.metadata.labels.fleet\\.cattle\\.io/shard-id,Node:spec.nodeName\'\nName Shard-ID Node\ngitjob-8498c6d78b-mdhgh k3d-upstream-server-1\ngitjob-shard-bar-8659ffc945-9vtlx bar k3d-upstream-server-1\ngitjob-shard-baz-6d67f596dc-fsz9m baz k3d-upstream-server-2\ngitjob-shard-foo-8697bb7f67-wzsfj foo k3d-upstream-server-0\n')),(0,n.yg)("h3",{id:"how-it-works"},"How it works"),(0,n.yg)("p",null,"With sharding in place, each Fleet controller will process resources bearing its own shard ID. This also holds for the\nunsharded controller, which has no set shard ID and will therefore process all unsharded resources."),(0,n.yg)("p",null,"To deploy a GitRepo for a specific shard, simply add label ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.cattle.io/shard-ref")," with your desired shard ID as a\nvalue.\nHere is an example:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"$ kubectl apply -n fleet-local -f - < ca.pem\n")),(0,n.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,n.yg)(i.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,n.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,n.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("h4",{id:"validate"},"Validate"),(0,n.yg)("p",null,"First validate the server URL is correct."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,n.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,n.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,n.yg)("p",null,"If you get a valid JSON response or an ",(0,n.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,n.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,n.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,n.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,n.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,n.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,n.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,n.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,n.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,n.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,n.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,n.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,n.yg)(o.A,{mdxType:"Tabs"},(0,n.yg)(i.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,n.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,n.yg)("p",null,"Third install the Fleet controllers."),(0,n.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,n.yg)(i.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,n.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,n.yg)("a",{parentName:"p",href:"/0.10/cluster-registration"},"register clusters")," and ",(0,n.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}y.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>l});const l=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/5a165616.1067c374.js b/assets/js/5a165616.1067c374.js new file mode 100644 index 000000000..39f278b56 --- /dev/null +++ b/assets/js/5a165616.1067c374.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4328],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=p(a),m=r,h=d["".concat(s,".").concat(m)]||d[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[d]="string"==typeof e?e:r,l[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/docs/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/gitrepo-add.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/gitrepo-targets"}},s={},p=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:3},{value:"Override Workload's Namespace",id:"override-workloads-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Known hosts",id:"known-hosts",level:3},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3},{value:"Storing Credentials in Git",id:"storing-credentials-in-git",level:3}],c={toc:p},d="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h3",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"override-workloads-namespace"},"Override Workload's Namespace"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetNamespace")," field will override any namespace in the bundle. If the deployment contains cluster scoped resources, it will fail."),(0,r.yg)("p",null,"It takes precendence over all other namespace definitions:"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.targetNamespace > fleet.yaml namespace > namespace in workload's manifest > fleet.yaml defaultNamespace")),(0,r.yg)("p",null,"Workload namespace definitions can be restricted with ",(0,r.yg)("inlineCode",{parentName:"p"},"allowedTargetNamespaces")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resource."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("p",null,"Now the ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName")," must be specified in the repo definition:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample-ssh\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "git@github.com:rancher/fleet-examples"\n # or\n # repo: "ssh://git@github.com/rancher/fleet-examples"\n clientSecretName: ssh-key\n paths:\n - simple\n')),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("h3",{id:"known-hosts"},"Known hosts"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add one or more public keys into the secret, any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.")),(0,r.yg)("h3",{id:"storing-credentials-in-git"},"Storing Credentials in Git"),(0,r.yg)("p",null,"It's recommended not to store credentials in Git. Even if the repository is properly protected, the secrets are at risk when cloning, etc.\nAs a workaround tools like SOPS can be used to encrypt the credentials."),(0,r.yg)("p",null,"Instead it is recommended to reference secrets in the downstream cluster. For manifest-style and kustomize-style bundles this must be done in the manifests, e.g. by ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#create-a-pod-that-has-access-to-the-secret-data-through-a-volume"},"mounting the secrets")," or ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables"},"referencing them as environment variables"),".\nHelm-style bundles can use ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-content#using-valuesfrom"},"valuesFrom")," to read values from a secret in the downstream cluster."),(0,r.yg)("p",null,"When using Kubernetes ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/"},"encryption at rest")," and storing credentials in Git, it is recommended to configure the upstream cluster to include several Fleet CRDs in encryption resource list:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"- secrets\n- bundles.fleet.cattle.io\n- bundledeployments.fleet.cattle.io\n- contents.fleet.cattle.io\n")),(0,r.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",null,"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/troubleshooting"},"here"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5a165616.4ee17e7c.js b/assets/js/5a165616.4ee17e7c.js deleted file mode 100644 index 631d59ad7..000000000 --- a/assets/js/5a165616.4ee17e7c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4328],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=p(a),m=r,h=d["".concat(s,".").concat(m)]||d[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[d]="string"==typeof e?e:r,l[1]=o;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/docs/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/gitrepo-add.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/gitrepo-targets"}},s={},p=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:3},{value:"Override Workload's Namespace",id:"override-workloads-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Known hosts",id:"known-hosts",level:3},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3},{value:"Storing Credentials in Git",id:"storing-credentials-in-git",level:3}],c={toc:p},d="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h3",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"override-workloads-namespace"},"Override Workload's Namespace"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetNamespace")," field will override any namespace in the bundle. If the deployment contains cluster scoped resources, it will fail."),(0,r.yg)("p",null,"It takes precendence over all other namespace definitions:"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.targetNamespace > fleet.yaml namespace > namespace in workload's manifest > fleet.yaml defaultNamespace")),(0,r.yg)("p",null,"Workload namespace definitions can be restricted with ",(0,r.yg)("inlineCode",{parentName:"p"},"allowedTargetNamespaces")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resource."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("p",null,"Now the ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName")," must be specified in the repo definition:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample-ssh\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "git@github.com:rancher/fleet-examples"\n # or\n # repo: "ssh://git@github.com/rancher/fleet-examples"\n clientSecretName: ssh-key\n paths:\n - simple\n')),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("h3",{id:"known-hosts"},"Known hosts"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add one or more public keys into the secret, any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.")),(0,r.yg)("h3",{id:"storing-credentials-in-git"},"Storing Credentials in Git"),(0,r.yg)("p",null,"It's recommended not to store credentials in Git. Even if the repository is properly protected, the secrets are at risk when cloning, etc.\nAs a workaround tools like SOPS can be used to encrypt the credentials."),(0,r.yg)("p",null,"Instead it is recommended to reference secrets in the downstream cluster. For manifest-style and kustomize-style bundles this must be done in the manifests, e.g. by ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#create-a-pod-that-has-access-to-the-secret-data-through-a-volume"},"mounting the secrets")," or ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables"},"referencing them as environment variables"),".\nHelm-style bundles can use ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-content#using-valuesfrom"},"valuesFrom")," to read values from a secret in the downstream cluster."),(0,r.yg)("p",null,"When using Kubernetes ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/"},"encryption at rest")," and storing credentials in Git, it is recommended to configure the upstream cluster to include several Fleet CRDs in encryption resource list:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"- secrets\n- bundles.fleet.cattle.io\n- bundledeployments.fleet.cattle.io\n- contents.fleet.cattle.io\n")),(0,r.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",null,"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/troubleshooting"},"here"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b0cdfa3.0d938eef.js b/assets/js/5b0cdfa3.0d938eef.js new file mode 100644 index 000000000..f335a3e47 --- /dev/null +++ b/assets/js/5b0cdfa3.0d938eef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6051],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.9/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.9/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.9/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/gitrepo-targets.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.9/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.9/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b0cdfa3.805fb58e.js b/assets/js/5b0cdfa3.805fb58e.js deleted file mode 100644 index ce41e4eb3..000000000 --- a/assets/js/5b0cdfa3.805fb58e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6051],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.9/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.9/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.9/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/gitrepo-targets.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.9/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.9/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b7f8ae0.33ed0c75.js b/assets/js/5b7f8ae0.33ed0c75.js deleted file mode 100644 index bb57530cb..000000000 --- a/assets/js/5b7f8ae0.33ed0c75.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1747],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.9/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.9/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.9/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cluster-bundles-state.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.9/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.9/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b7f8ae0.8d155bb1.js b/assets/js/5b7f8ae0.8d155bb1.js new file mode 100644 index 000000000..9343831c8 --- /dev/null +++ b/assets/js/5b7f8ae0.8d155bb1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1747],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.9/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.9/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.9/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cluster-bundles-state.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.9/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.9/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5fdf261e.8b5c5f30.js b/assets/js/5fdf261e.23dace26.js similarity index 66% rename from assets/js/5fdf261e.8b5c5f30.js rename to assets/js/5fdf261e.23dace26.js index 0f0b2594b..cb81f03ed 100644 --- a/assets/js/5fdf261e.8b5c5f30.js +++ b/assets/js/5fdf261e.23dace26.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8042],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),f=c(r),u=l,d=f["".concat(s,".").concat(u)]||f[u]||p[u]||a;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,i=new Array(a);i[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[f]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-agent register"},i=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_register",id:"cli/fleet-agent/fleet-agent_register",title:"",description:"fleet-agent register",source:"@site/docs/cli/fleet-agent/fleet-agent_register.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_register",permalink:"/cli/fleet-agent/fleet-agent_register",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-agent/fleet-agent_register.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent register"},sidebar:"docs",previous:{title:"fleet-agent clusterstatus",permalink:"/cli/fleet-agent/fleet-agent_clusterstatus"},next:{title:"fleet",permalink:"/cli/fleet-cli/fleet"}},s={},c=[{value:"fleet-agent register",id:"fleet-agent-register",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],g={toc:c},f="wrapper";function p(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},g,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-register"},"fleet-agent register"),(0,l.yg)("p",null,"Register agent with an upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent register [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for register\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8042],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),f=c(r),u=l,d=f["".concat(s,".").concat(u)]||f[u]||p[u]||a;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,i=new Array(a);i[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[f]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-agent register"},i=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_register",id:"cli/fleet-agent/fleet-agent_register",title:"",description:"fleet-agent register",source:"@site/docs/cli/fleet-agent/fleet-agent_register.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_register",permalink:"/cli/fleet-agent/fleet-agent_register",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-agent/fleet-agent_register.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent register"},sidebar:"docs",previous:{title:"fleet-agent clusterstatus",permalink:"/cli/fleet-agent/fleet-agent_clusterstatus"},next:{title:"fleet",permalink:"/cli/fleet-cli/fleet"}},s={},c=[{value:"fleet-agent register",id:"fleet-agent-register",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],g={toc:c},f="wrapper";function p(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},g,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-register"},"fleet-agent register"),(0,l.yg)("p",null,"Register agent with an upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent register [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for register\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5ff573a6.4a631956.js b/assets/js/5ff573a6.4a631956.js new file mode 100644 index 000000000..19d0d6379 --- /dev/null +++ b/assets/js/5ff573a6.4a631956.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7242],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),l=n(53);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),l=n(6540),r=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:l}}=e;return{value:t,label:n,attributes:a,default:l}}))}function d(e){const{values:t,children:n}=e;return(0,l.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(a.location.search);t.set(r,e),a.replace({...a.location,search:t.toString()})}),[r,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,r=d(e),[i,s]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:r}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,r]=(0,c.Dv)(n);return[a,(0,l.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,l.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return l.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,r.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===a));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},l.createElement(b,(0,a.A)({},e,t)),l.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return l.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},909:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),l=(n(6540),n(5680)),r=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.7/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.7/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.7/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cluster-registration.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.7/installation"},next:{title:"Create Cluster Groups",permalink:"/0.7/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,l.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,l.yg)("h2",{id:"overview"},"Overview"),(0,l.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,l.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,l.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,l.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,l.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,l.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,l.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,l.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,l.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,l.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,l.yg)("strong",{parentName:"p"},"client ID")," or ",(0,l.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,l.yg)("a",{parentName:"p",href:"/0.7/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,l.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,l.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe cluster registration token is manifested as a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,l.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,l.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,l.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,l.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,l.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,l.yg)("p",null,"First, follow the ",(0,l.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,l.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,l.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,l.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,l.yg)("p",null,"Value in ",(0,l.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,l.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,l.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"Add Fleet's Helm repo."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,l.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,l.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,l.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,l.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,l.yg)("p",null,"First, create a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,l.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,l.yg)("p",null,"Third, setup your environment to use the client ID."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Add Fleet's Helm repo."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,l.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,l.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,l.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,l.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,l.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,l.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,l.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,l.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,l.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,l.yg)("p",null,"After the ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,l.yg)("p",null,"One way to do so is via the following one-liner:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,l.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,l.yg)("p",null,"The token value contains YAML content for a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,l.yg)("p",null,"Such value is contained in the ",(0,l.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,l.yg)("p",null,"Once the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,l.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,l.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,l.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,l.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,l.yg)("a",{parentName:"p",href:"/0.7/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,l.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,l.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,l.yg)("p",null,"The format of this secret is intended to match the ",(0,l.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,l.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,l.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,l.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5ff573a6.e3348b2d.js b/assets/js/5ff573a6.e3348b2d.js deleted file mode 100644 index eed4f4d79..000000000 --- a/assets/js/5ff573a6.e3348b2d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7242],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),l=n(53);const r={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),l=n(6540),r=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:l}}=e;return{value:t,label:n,attributes:a,default:l}}))}function d(e){const{values:t,children:n}=e;return(0,l.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),r=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(a.location.search);t.set(r,e),a.replace({...a.location,search:t.toString()})}),[r,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,r=d(e),[i,s]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:r}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,r]=(0,c.Dv)(n);return[a,(0,l.useCallback)((e=>{n&&r.set(e)}),[n,r])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,l.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return l.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,r.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===a));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},l.createElement(b,(0,a.A)({},e,t)),l.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return l.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},909:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),l=(n(6540),n(5680)),r=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.7/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.7/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.7/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cluster-registration.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.7/installation"},next:{title:"Create Cluster Groups",permalink:"/0.7/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,l.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,l.yg)("h2",{id:"overview"},"Overview"),(0,l.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,l.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,l.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,l.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,l.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,l.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,l.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,l.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,l.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,l.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,l.yg)("strong",{parentName:"p"},"client ID")," or ",(0,l.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,l.yg)("a",{parentName:"p",href:"/0.7/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,l.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,l.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe cluster registration token is manifested as a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,l.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,l.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,l.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,l.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,l.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,l.yg)("p",null,"First, follow the ",(0,l.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,l.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,l.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,l.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,l.yg)("p",null,"Value in ",(0,l.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,l.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,l.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"Add Fleet's Helm repo."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,l.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,l.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,l.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,l.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,l.yg)("p",null,"First, create a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,l.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,l.yg)("p",null,"Third, setup your environment to use the client ID."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Add Fleet's Helm repo."),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,l.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,l.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,l.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,l.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,l.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,l.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,l.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,l.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,l.yg)("a",{parentName:"p",href:"/0.7/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,l.yg)("p",null,"After the ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,l.yg)("p",null,"One way to do so is via the following one-liner:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,l.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,l.yg)("p",null,"The token value contains YAML content for a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,l.yg)("p",null,"Such value is contained in the ",(0,l.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,l.yg)("p",null,"Once the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,l.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,l.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,l.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,l.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,l.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,l.yg)("a",{parentName:"p",href:"/0.7/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,l.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,l.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,l.yg)("p",null,"The format of this secret is intended to match the ",(0,l.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,l.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,l.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,l.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/60bcd92c.1d599654.js b/assets/js/60bcd92c.1d599654.js deleted file mode 100644 index b1cd7aab0..000000000 --- a/assets/js/60bcd92c.1d599654.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[476],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4044:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>y,frontMatter:()=>u,metadata:()=>g,toc:()=>p});var a=n(8168),r=(n(6540),n(5680)),l=n(7858),i=n(2355),s=n(1470),o=n(9365);const u={},c="Register Downstream Clusters",g={unversionedId:"cluster-registration",id:"version-0.6/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.6/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.6/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cluster-registration.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.6/installation"},next:{title:"Create Cluster Groups",permalink:"/0.6/cluster-group"}},d={},p=[{value:"Overview",id:"overview",level:2},{value:"Agent Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],m={toc:p},h="wrapper";function y(e){let{components:t,...n}=e;return(0,r.yg)(h,(0,a.A)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager initiated")," registration. Typically one would\ngo with the agent initiated registration but there are specific use cases in which\nmanager initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent Initiated Registration"),(0,r.yg)("p",null,"Agent initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager Initiated Registration"),(0,r.yg)("p",null,"Manager initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.6/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe cluster registration token is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(s.A,{mdxType:"Tabs"},(0,r.yg)(o.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(i.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent'," ",l.e["v0.6"].fleetAgent)),(0,r.yg)(o.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(s.A,{mdxType:"Tabs"},(0,r.yg)(o.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(i.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent'," ",l.e["v0.6"].fleetAgent)),(0,r.yg)(o.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager initiated registration"),":\nFor manager initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.6/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}y.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/60bcd92c.7aa854a8.js b/assets/js/60bcd92c.7aa854a8.js new file mode 100644 index 000000000..0baba39b8 --- /dev/null +++ b/assets/js/60bcd92c.7aa854a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[476],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4044:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>y,frontMatter:()=>u,metadata:()=>g,toc:()=>p});var a=n(8168),r=(n(6540),n(5680)),l=n(7858),i=n(2355),s=n(1470),o=n(9365);const u={},c="Register Downstream Clusters",g={unversionedId:"cluster-registration",id:"version-0.6/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.6/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.6/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cluster-registration.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.6/installation"},next:{title:"Create Cluster Groups",permalink:"/0.6/cluster-group"}},d={},p=[{value:"Overview",id:"overview",level:2},{value:"Agent Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],m={toc:p},h="wrapper";function y(e){let{components:t,...n}=e;return(0,r.yg)(h,(0,a.A)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager initiated")," registration. Typically one would\ngo with the agent initiated registration but there are specific use cases in which\nmanager initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent Initiated Registration"),(0,r.yg)("p",null,"Agent initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager Initiated Registration"),(0,r.yg)("p",null,"Manager initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.6/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe cluster registration token is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(s.A,{mdxType:"Tabs"},(0,r.yg)(o.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(i.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent'," ",l.e["v0.6"].fleetAgent)),(0,r.yg)(o.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(s.A,{mdxType:"Tabs"},(0,r.yg)(o.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(i.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent'," ",l.e["v0.6"].fleetAgent)),(0,r.yg)(o.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager initiated registration"),":\nFor manager initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.6/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}y.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/60c2c817.7ed6a765.js b/assets/js/60c2c817.7ed6a765.js deleted file mode 100644 index 4b55a4f9a..000000000 --- a/assets/js/60c2c817.7ed6a765.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2299],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.9/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.9/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.9/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-gitrepo.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.9/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.9/ref-bundle"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n #\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default. \n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating \n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/60c2c817.9dc36e70.js b/assets/js/60c2c817.9dc36e70.js new file mode 100644 index 000000000..ade49f21e --- /dev/null +++ b/assets/js/60c2c817.9dc36e70.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2299],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(f,s(s({ref:t},p),{},{components:n})):r.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.9/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.9/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.9/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-gitrepo.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.9/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.9/ref-bundle"}},c={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n #\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n #\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default. \n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating \n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/610ec0b5.0760d525.js b/assets/js/610ec0b5.0760d525.js deleted file mode 100644 index 952be04a5..000000000 --- a/assets/js/610ec0b5.0760d525.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2239],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),g=l,m=p["".concat(s,".").concat(g)]||p[g]||f[g]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=g;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.10/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.10/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.10/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-configuration.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.10/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/0.10/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/internal/config/config.go#L57"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-id=")," - The shard ID of a fleet controller pod."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-default=true")," - true if this is the controller managing resources without a shard reference label."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-ref=")," - references the Shard ID assigned by\nFleet to resources, inherited from a ",(0,l.yg)("inlineCode",{parentName:"li"},"GitRepo"),", which determines which Fleet controller deployment will reconcile them.",(0,l.yg)("ul",{parentName:"li"},(0,l.yg)("li",{parentName:"ul"},"If this label is not provided or has an empty value, then the unsharded Fleet controller will process the resource."),(0,l.yg)("li",{parentName:"ul"},"If this label has a value which does not match any shard ID for which a Fleet controller is deployed, then the\nresource will not be processed.")))),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/610ec0b5.b448bd46.js b/assets/js/610ec0b5.b448bd46.js new file mode 100644 index 000000000..0ec52ef50 --- /dev/null +++ b/assets/js/610ec0b5.b448bd46.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2239],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),g=l,m=p["".concat(s,".").concat(g)]||p[g]||f[g]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=g;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.10/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.10/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.10/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-configuration.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.10/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/0.10/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/internal/config/config.go#L57"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-id=")," - The shard ID of a fleet controller pod."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-default=true")," - true if this is the controller managing resources without a shard reference label."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-ref=")," - references the Shard ID assigned by\nFleet to resources, inherited from a ",(0,l.yg)("inlineCode",{parentName:"li"},"GitRepo"),", which determines which Fleet controller deployment will reconcile them.",(0,l.yg)("ul",{parentName:"li"},(0,l.yg)("li",{parentName:"ul"},"If this label is not provided or has an empty value, then the unsharded Fleet controller will process the resource."),(0,l.yg)("li",{parentName:"ul"},"If this label has a value which does not match any shard ID for which a Fleet controller is deployed, then the\nresource will not be processed.")))),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/612623d2.e0a8d91e.js b/assets/js/612623d2.b49aa2dc.js similarity index 63% rename from assets/js/612623d2.e0a8d91e.js rename to assets/js/612623d2.b49aa2dc.js index 137dcdeef..4203354fd 100644 --- a/assets/js/612623d2.e0a8d91e.js +++ b/assets/js/612623d2.b49aa2dc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[675],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=l.createContext({}),p=function(e){var t=l.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return l.createElement(o.Provider,{value:t},e.children)},f="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,o=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),f=p(n),d=r,g=f["".concat(o,".").concat(d)]||f[d]||s[d]||a;return n?l.createElement(g,i(i({ref:t},u),{},{components:n})):l.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var o in t)hasOwnProperty.call(t,o)&&(c[o]=t[o]);c.originalType=e,c[f]="string"==typeof e?e:r,i[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>c,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet cleanup"},i=void 0,c={unversionedId:"cli/fleet-cli/fleet_cleanup",id:"cli/fleet-cli/fleet_cleanup",title:"",description:"fleet cleanup",source:"@site/docs/cli/fleet-cli/fleet_cleanup.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_cleanup",permalink:"/cli/fleet-cli/fleet_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_cleanup.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet cleanup"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/cli/fleet-cli/fleet_apply"},next:{title:"fleet deploy",permalink:"/cli/fleet-cli/fleet_deploy"}},o={},p=[{value:"fleet cleanup",id:"fleet-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:p},f="wrapper";function s(e){let{components:t,...n}=e;return(0,r.yg)(f,(0,l.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-cleanup"},"fleet cleanup"),(0,r.yg)("p",null,"Clean up outdated cluster registrations"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet cleanup [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --factor string Factor to increase delay between deletes (default: 1.1)\n -h, --help help for cleanup\n -k, --kubeconfig string kubeconfig for authentication\n --max string Maximum delay between deletes (default: 5s)\n --min string Minimum delay between deletes (default: 10ms)\n -n, --namespace string namespace (default "fleet-local")\n')),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[675],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=l.createContext({}),p=function(e){var t=l.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return l.createElement(o.Provider,{value:t},e.children)},f="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,o=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),f=p(n),d=r,g=f["".concat(o,".").concat(d)]||f[d]||s[d]||a;return n?l.createElement(g,i(i({ref:t},u),{},{components:n})):l.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var o in t)hasOwnProperty.call(t,o)&&(c[o]=t[o]);c.originalType=e,c[f]="string"==typeof e?e:r,i[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>c,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet cleanup"},i=void 0,c={unversionedId:"cli/fleet-cli/fleet_cleanup",id:"cli/fleet-cli/fleet_cleanup",title:"",description:"fleet cleanup",source:"@site/docs/cli/fleet-cli/fleet_cleanup.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_cleanup",permalink:"/cli/fleet-cli/fleet_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_cleanup.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet cleanup"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/cli/fleet-cli/fleet_apply"},next:{title:"fleet deploy",permalink:"/cli/fleet-cli/fleet_deploy"}},o={},p=[{value:"fleet cleanup",id:"fleet-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:p},f="wrapper";function s(e){let{components:t,...n}=e;return(0,r.yg)(f,(0,l.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-cleanup"},"fleet cleanup"),(0,r.yg)("p",null,"Clean up outdated cluster registrations"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet cleanup [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --factor string Factor to increase delay between deletes (default: 1.1)\n -h, --help help for cleanup\n -k, --kubeconfig string kubeconfig for authentication\n --max string Maximum delay between deletes (default: 5s)\n --min string Minimum delay between deletes (default: 10ms)\n -n, --namespace string namespace (default "fleet-local")\n')),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62061bdc.3a5ec889.js b/assets/js/62061bdc.3a5ec889.js deleted file mode 100644 index 3e90090ca..000000000 --- a/assets/js/62061bdc.3a5ec889.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1471],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=o,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?a.createElement(u,r(r({ref:t},p),{},{components:n})):a.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:o,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),o=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.10/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.10/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.10/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/troubleshooting.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.10/ref-bundle"},next:{title:"v0.10.0",permalink:"/0.10/changelogs/changelogs/v0.10.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3},{value:"Bundle failed to deploy: "resource already exists" Error",id:"bundle-failed-to-deploy-resource-already-exists-error",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,o.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,o.yg)("h2",{id:"how-do-i"},(0,o.yg)("strong",{parentName:"h2"},"How Do I...")),(0,o.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"In the local management cluster where the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,o.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,o.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,o.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,o.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,o.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,o.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,o.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("a",{parentName:"p",href:"/0.10/troubleshooting#fetch-the-log-from-fleet-controller"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,o.yg)("a",{parentName:"p",href:"/0.10/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,o.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,o.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,o.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,o.yg)("p",null,"The pods will usually have images named ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,o.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"You can check the status of the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,o.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Go to the ",(0,o.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,o.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,o.yg)("li",{parentName:"ul"},"Select ",(0,o.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,o.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,o.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,o.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,o.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,o.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,o.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,o.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"For CRD terms like ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,o.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,o.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Create a ",(0,o.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,o.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,o.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,o.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,o.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,o.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,o.yg)("a",{parentName:"p",href:"/0.10/ref-fleet-yaml"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,o.yg)("p",null,"Perform the following steps to assess:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,o.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,o.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,o.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,o.yg)("p",null,"Please verify your certificate with the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,o.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,o.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,o.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,o.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,o.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,o.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,o.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"Check the ",(0,o.yg)("a",{parentName:"p",href:"/0.10/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"You can also force update the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,o.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,o.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,o.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,o.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,o.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,o.yg)("p",null,"You must define a patch in the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,o.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,o.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,o.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,o.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,o.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,o.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,o.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update")),(0,o.yg)("admonition",{type:"caution"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,o.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,o.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,o.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,o.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,o.yg)("p",null,"When you see an error like the one below ..."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,o.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,o.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,o.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,o.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,o.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,o.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."),(0,o.yg)("h3",{id:"bundle-failed-to-deploy-resource-already-exists-error"},'Bundle failed to deploy: "resource already exists" Error'),(0,o.yg)("p",null,"If your bundle encounters the following error message during deployment:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'not installed: rendered manifests contain a resource that already\nexists. Unable to continue with install: ClusterRole "grafana-clusterrole"\nin namespace "" exists and cannot be imported into the current release: invalid\nownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"\nmust equal "ns-2": current value is "ns-1"\n')),(0,o.yg)("p",null,"This error occurs because a Helm resource with the same ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," already exists in the cluster. To resolve this issue, you need to change the ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," of the resource you want to create to avoid the conflict."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62061bdc.f6ce71f7.js b/assets/js/62061bdc.f6ce71f7.js new file mode 100644 index 000000000..ec1e31499 --- /dev/null +++ b/assets/js/62061bdc.f6ce71f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1471],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=o,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?a.createElement(u,r(r({ref:t},p),{},{components:n})):a.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:o,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),o=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.10/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.10/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.10/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/troubleshooting.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.10/ref-bundle"},next:{title:"v0.10.0",permalink:"/0.10/changelogs/changelogs/v0.10.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3},{value:"Bundle failed to deploy: "resource already exists" Error",id:"bundle-failed-to-deploy-resource-already-exists-error",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,o.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,o.yg)("h2",{id:"how-do-i"},(0,o.yg)("strong",{parentName:"h2"},"How Do I...")),(0,o.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"In the local management cluster where the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,o.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,o.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,o.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,o.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,o.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,o.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,o.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("a",{parentName:"p",href:"/0.10/troubleshooting#fetch-the-log-from-fleet-controller"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,o.yg)("a",{parentName:"p",href:"/0.10/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,o.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,o.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,o.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,o.yg)("p",null,"The pods will usually have images named ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,o.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"You can check the status of the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,o.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Go to the ",(0,o.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,o.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,o.yg)("li",{parentName:"ul"},"Select ",(0,o.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,o.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,o.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,o.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,o.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,o.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,o.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,o.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"For CRD terms like ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,o.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,o.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Create a ",(0,o.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,o.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,o.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,o.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,o.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,o.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,o.yg)("a",{parentName:"p",href:"/0.10/ref-fleet-yaml"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,o.yg)("p",null,"Perform the following steps to assess:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,o.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,o.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,o.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,o.yg)("p",null,"Please verify your certificate with the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,o.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,o.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,o.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,o.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,o.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,o.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,o.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"Check the ",(0,o.yg)("a",{parentName:"p",href:"/0.10/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"You can also force update the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,o.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,o.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,o.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,o.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,o.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,o.yg)("p",null,"You must define a patch in the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,o.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,o.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,o.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,o.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,o.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,o.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,o.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update")),(0,o.yg)("admonition",{type:"caution"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,o.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,o.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,o.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,o.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,o.yg)("p",null,"When you see an error like the one below ..."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,o.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,o.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,o.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,o.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,o.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,o.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."),(0,o.yg)("h3",{id:"bundle-failed-to-deploy-resource-already-exists-error"},'Bundle failed to deploy: "resource already exists" Error'),(0,o.yg)("p",null,"If your bundle encounters the following error message during deployment:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'not installed: rendered manifests contain a resource that already\nexists. Unable to continue with install: ClusterRole "grafana-clusterrole"\nin namespace "" exists and cannot be imported into the current release: invalid\nownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"\nmust equal "ns-2": current value is "ns-1"\n')),(0,o.yg)("p",null,"This error occurs because a Helm resource with the same ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," already exists in the cluster. To resolve this issue, you need to change the ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," of the resource you want to create to avoid the conflict."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6271ce2c.bd29b6c7.js b/assets/js/6271ce2c.63ab3cda.js similarity index 55% rename from assets/js/6271ce2c.bd29b6c7.js rename to assets/js/6271ce2c.63ab3cda.js index c1a89ad40..c71c09fc5 100644 --- a/assets/js/6271ce2c.bd29b6c7.js +++ b/assets/js/6271ce2c.63ab3cda.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7482],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},f),{},{components:r})):n.createElement(g,a({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet target"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_target",id:"version-0.10/cli/fleet-cli/fleet_target",title:"",description:"fleet target",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_target.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_target",permalink:"/0.10/cli/fleet-cli/fleet_target",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_target.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet target"},sidebar:"docs",previous:{title:"fleet deploy",permalink:"/0.10/cli/fleet-cli/fleet_deploy"},next:{title:"fleet test",permalink:"/0.10/cli/fleet-cli/fleet_test"}},c={},s=[{value:"fleet target",id:"fleet-target",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-target"},"fleet target"),(0,l.yg)("p",null,"Print available targets for a bundle"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet target [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the Bundle resource yaml\n -l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML\n -h, --help help for target\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7482],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},f),{},{components:r})):n.createElement(g,a({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet target"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_target",id:"version-0.10/cli/fleet-cli/fleet_target",title:"",description:"fleet target",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_target.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_target",permalink:"/0.10/cli/fleet-cli/fleet_target",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_target.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet target"},sidebar:"docs",previous:{title:"fleet deploy",permalink:"/0.10/cli/fleet-cli/fleet_deploy"},next:{title:"fleet test",permalink:"/0.10/cli/fleet-cli/fleet_test"}},c={},s=[{value:"fleet target",id:"fleet-target",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-target"},"fleet target"),(0,l.yg)("p",null,"Print available targets for a bundle"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet target [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the Bundle resource yaml\n -l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML\n -h, --help help for target\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62bbc60f.6e3db6a2.js b/assets/js/62bbc60f.6e3db6a2.js deleted file mode 100644 index a76f414ce..000000000 --- a/assets/js/62bbc60f.6e3db6a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1430],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.6/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.6/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.6/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/namespaces.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.6/gitrepo-content"},next:{title:"Custom Resources",permalink:"/0.6/ref-resources"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.6/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.6/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/62bbc60f.a246f429.js b/assets/js/62bbc60f.a246f429.js new file mode 100644 index 000000000..67a2b8593 --- /dev/null +++ b/assets/js/62bbc60f.a246f429.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1430],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.6/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.6/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.6/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/namespaces.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.6/gitrepo-content"},next:{title:"Custom Resources",permalink:"/0.6/ref-resources"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.6/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.6/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.6/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/6349fbc0.b24d35a0.js b/assets/js/6349fbc0.b24d35a0.js new file mode 100644 index 000000000..113d9d1e7 --- /dev/null +++ b/assets/js/6349fbc0.b24d35a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2086],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var u=n.createContext({}),y=function(e){var t=n.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},p=function(e){var t=y(e.components);return n.createElement(u.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),m=y(a),d=l,o=m["".concat(u,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},p),{},{components:a})):n.createElement(o,g({ref:t},p))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var y=2;y{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>y});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.8/ref-crds",title:"Custom Resources Spec",description:"* GitRepo",source:"@site/versioned_docs/version-0.8/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.8/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-crds.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/0.8/ref-resources"},next:{title:"fleet.yaml",permalink:"/0.8/ref-fleet-yaml"}},u={},y=[{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"Bundle",id:"bundle",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"Content",id:"content",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4}],p={toc:y},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus"))),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last gitjob run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last GitJob run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.\\n\\nWhen a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes Fleet skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNodes is the number of nodes that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes is the number of nodes that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes contains the names of ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyNodes is a string in the form \\"%d/%d\\", that describes the number of nodes that are ready vs. the number of expected nodes.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null},"SampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6349fbc0.d062d2e3.js b/assets/js/6349fbc0.d062d2e3.js deleted file mode 100644 index d0ea2aef2..000000000 --- a/assets/js/6349fbc0.d062d2e3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2086],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var u=n.createContext({}),y=function(e){var t=n.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},p=function(e){var t=y(e.components);return n.createElement(u.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),m=y(a),d=l,o=m["".concat(u,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},p),{},{components:a})):n.createElement(o,g({ref:t},p))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var y=2;y{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>y});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.8/ref-crds",title:"Custom Resources Spec",description:"* GitRepo",source:"@site/versioned_docs/version-0.8/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.8/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-crds.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/0.8/ref-resources"},next:{title:"fleet.yaml",permalink:"/0.8/ref-fleet-yaml"}},u={},y=[{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"Bundle",id:"bundle",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"Content",id:"content",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4}],p={toc:y},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus"))),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last gitjob run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last GitJob run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.\\n\\nWhen a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes Fleet skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNodes is the number of nodes that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes is the number of nodes that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes contains the names of ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyNodes is a string in the form \\"%d/%d\\", that describes the number of nodes that are ready vs. the number of expected nodes.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null},"SampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/635f26b6.e87fe39b.js b/assets/js/635f26b6.e87fe39b.js new file mode 100644 index 000000000..0285c3ce9 --- /dev/null +++ b/assets/js/635f26b6.e87fe39b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6063],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},9374:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.8/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.8/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.8/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cluster-registration.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.8/installation"},next:{title:"Create Cluster Groups",permalink:"/0.8/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.8/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/0.8/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/0.8/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.8/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6417316b.0a2d4f29.js b/assets/js/6417316b.0a2d4f29.js new file mode 100644 index 000000000..259e545a1 --- /dev/null +++ b/assets/js/6417316b.0a2d4f29.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1489],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>h});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=l,h=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(h,r(r({ref:t},c),{},{components:n})):a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,r=new Array(o);r[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:l,r[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(8168),l=(n(6540),n(5680));const o={},r="fleet.yaml",i={unversionedId:"ref-fleet-yaml",id:"version-0.10/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a",source:"@site/versioned_docs/version-0.10/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.10/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-fleet-yaml.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.10/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.10/ref-gitrepo"}},s={},u=[{value:"Reference",id:"reference",level:3},{value:"Helm Options",id:"helm-options",level:3},{value:"How fleet-agent deploys the bundle",id:"how-fleet-agent-deploys-the-bundle",level:4},{value:"Helm Chart Download Options",id:"helm-chart-download-options",level:4},{value:"Helm Chart Value Options",id:"helm-chart-value-options",level:4},{value:"Templating",id:"templating",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a\n",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,l.yg)("p",null,"For more information on how to use the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see\n",(0,l.yg)("a",{parentName:"p",href:"/0.10/gitrepo-content"},"Git Repository Contents"),"."),(0,l.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at\n",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),",\nwhich contains the ",(0,l.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,l.yg)("h3",{id:"reference"},"Reference"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified in\n# the manifests.\n#\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n#\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by\n# Fleet.\nnamespaceLabels:\n key: value\n\n# namespaceAnnotations are annotations that will be appended to the namespace\n# created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain a\n # kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n\n # These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter\n # URL or OCI registry based helm chart URL e.g.\n # "oci://ghcr.io/fleetrepoci/guestbook". This allows one to download charts\n # from most any location. Also know that go-getter URL supports adding a\n # digest to validate the download. If repo is set below this field is the name\n # of the chart to lookup.\n #\n # It is possible to download the chart from a Git repository, e.g. by using\n # `git@github.com:rancher/fleet-examples//single-cluster/helm`. If a secret\n # for the SSH key was defined in the GitRepo via `helmSecretName`, it will be\n # injected into the chart URL.\n #\n # Git repositories can be downloaded via unauthenticated http, by using for\n # example:\n #\n # `git::http://github.com/rancher/fleet-examples/single-cluster/helm`.\n chart: ./chart\n\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm\n # repository.\n repo: https://charts.rancher.io\n\n # The version of the chart or semver constraint of the chart to find. If a\n # constraint is specified it is evaluated each time git changes.\n #\n # The version also determines which chart to download from OCI registries.\n # Note: OCI registries don\'t support the \'+\' character, which is supported by\n # semver. When pushing a helm chart with a tag containing the \'+\' character\n # helm automatically replaces \'+\' to \'_\' before uploading it.\n #\n # You should use the version with the \'+\' in this file, as the \'_\' character\n # is not supported by semver and Fleet also replaces \'+\' to \'_\' when accessing\n # the OCI registry.\n version: 0.1.0\n\n # By default fleet downloads any dependency found in a helm chart. Use\n # disableDependencyUpdate: true to disable this feature.\n disableDependencyUpdate: false\n\n ### These options only work for helm-type bundles.\n #\n # Any values that should be placed in the `values.yaml` and passed to helm\n # during install.\n values:\n\n any-custom: value\n\n # All labels on Rancher clusters are available using\n # global.fleet.clusterLabels.LABELNAME These can now be accessed directly as\n # variables The variable\'s value will be an empty string if the referenced\n # cluster label does not exist on the targeted cluster.\n variableName: global.fleet.clusterLabels.LABELNAME\n\n # See Templating notes below for more information on templating.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n\n # Path to any values files that need to be passed to helm during install.\n valuesFiles:\n - values1.yaml\n - values2.yaml\n\n # Allow to use values files from configmaps or secrets defined in the\n # downstream clusters.\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply\n ### for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n #\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n #\n # Override immutable resources. This could be dangerous.\n force: false\n #\n # Set the Helm --atomic flag when upgrading\n atomic: false\n #\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n #\n # Disable DNS resolution in Helm\'s template functions\n disableDNS: false\n #\n # Skip evaluation of the values.schema.json file\n skipSchemaValidation: false\n #\n # If set and timeoutSeconds provided, will wait until all Jobs have been\n # completed before marking the GitRepo as ready. It will wait for as long as\n # timeoutSeconds.\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n#\n# Default: false\npaused: false\n\nrolloutStrategy:\n\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n #\n # default: 100%\n maxUnavailable: 15%\n\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n #\n # default: 0\n maxUnavailablePartitions: 20%\n\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n #\n # default: 25%\n autoPartitionSize: 10%\n\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n\n # A cluster group name to include in this partition\n clusterGroup: agroup\n\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified\n# per target Targets are evaluated in order and the first one to match a cluster\n# is used for that cluster.\ntargetCustomizations:\n\n # The name of target. If not specified a default name of the format\n # "target000" will be used. This value is mostly for display\n - name: prod\n\n # Custom namespace value overriding the value at the root.\n namespace: newvalue\n\n # Custom defaultNamespace value overriding the value at the root.\n defaultNamespace: newdefaultvalue\n\n # Custom kustomize options overriding the options at the root.\n kustomize: {}\n\n # Custom Helm options override the options at the root.\n helm: {}\n\n # If using raw YAML these are names that map to overlays/{name} that will be\n # used to replace or patch a resource. If you wish to customize the file\n # ./subdir/resource.yaml then a file\n # ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A\n # file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the\n # base file. A patch can in JSON Patch or JSON Merge format or a strategic\n # merge patch for builtin Kubernetes types. Refer to "Raw YAML Resource\n # Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is\n # specified, clusterSelector will be used only to further refine the\n # selection after clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io\n # resource.\n clusterName: dev-cluster\n\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n\n # A specific clusterGroup by name that will be selected.\n clusterGroup: group1\n\n # Resources will not be deployed in the matched clusters if doNotDeploy is\n # true.\n doNotDeploy: false\n\n # Drift correction removes any external change made to resources managed by\n # Fleet. It performs a helm rollback, which uses a three-way merge strategy\n # by default. It will try to update all resources by doing a PUT request if\n # force is enabled. Three-way strategic merge might fail when updating an\n # item inside of an array as it will try to add a new item instead of\n # replacing the existing one. This can be fixed by using force. Keep in\n # mind that resources might be recreated if force is enabled. Failed\n # rollback will be removed from the helm history unless keepFailHistory is\n # set to true.\n correctDrift:\n enabled: false\n force: false # Warning: it might recreate resources if set to true\n keepFailHistory: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current\n# bundle will only be deployed, after all dependencies are deployed and in a\n# Ready state.\ndependsOn:\n\n # Format:\n # - with all path separators replaced by "-"\n #\n # Example:\n #\n # GitRepo name "one", Bundle path "/multi-cluster/hello-world"\n # results in "one-multi-cluster-hello-world".\n #\n # Note:\n #\n # Bundle names are limited to 53 characters long. If longer they will be\n # shortened:\n #\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes\n # opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks\n# some conditions in Custom Resources makes the Bundle to be in an error state\n# when it shouldn\'t.\nignore:\n\n # Conditions to be ignored\n conditions:\n\n # In this example a condition will be ignored if it contains\n # {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets\n# from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n')),(0,l.yg)("h3",{id:"helm-options"},"Helm Options"),(0,l.yg)("h4",{id:"how-fleet-agent-deploys-the-bundle"},"How fleet-agent deploys the bundle"),(0,l.yg)("p",null,"These options also apply to kustomize- and manifest-style bundles. They control\nhow the fleet-agent deploys the bundle. All bundles are converted into Helm\ncharts and deployed with the Helm SDK. These options are often similar to the\nHelm CLI options for install and update."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"releaseName"),(0,l.yg)("li",{parentName:"ul"},"takeOwnership"),(0,l.yg)("li",{parentName:"ul"},"force"),(0,l.yg)("li",{parentName:"ul"},"atomic"),(0,l.yg)("li",{parentName:"ul"},"disablePreProcess"),(0,l.yg)("li",{parentName:"ul"},"disableDNS"),(0,l.yg)("li",{parentName:"ul"},"skipSchemaValidation"),(0,l.yg)("li",{parentName:"ul"},"waitForJobs")),(0,l.yg)("h4",{id:"helm-chart-download-options"},"Helm Chart Download Options"),(0,l.yg)("p",null,"These options are for Helm-style bundles, they specify how to download the\nchart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"chart"),(0,l.yg)("li",{parentName:"ul"},"repo"),(0,l.yg)("li",{parentName:"ul"},"version")),(0,l.yg)("p",null,"The reference to the chart can be either:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"a local path in the cloned Git repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),"."),(0,l.yg)("li",{parentName:"ul"},"a ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/hashicorp/go-getter?tab=readme-ov-file#url-format"},"go-getter URL"),",\nspecified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),". This can be used to download a tarball\nof the chart. go-getter also allows to download a chart from a Git repo."),(0,l.yg)("li",{parentName:"ul"},"a Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),"."),(0,l.yg)("li",{parentName:"ul"},"an OCI Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),".")),(0,l.yg)("h4",{id:"helm-chart-value-options"},"Helm Chart Value Options"),(0,l.yg)("p",null,"Options for the downloaded Helm chart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"values"),(0,l.yg)("li",{parentName:"ul"},"valuesFiles"),(0,l.yg)("li",{parentName:"ul"},"valueFrom")),(0,l.yg)("h3",{id:"templating"},"Templating"),(0,l.yg)("p",null,"It is possible to specify the keys and values as go template strings for\nadvanced templating needs. Most of the functions from the ",(0,l.yg)("a",{parentName:"p",href:"https://masterminds.github.io/sprig/"},"sprig templating\nlibrary")," are available."),(0,l.yg)("p",null,"Note that if the functions output changes with every call, e.g. ",(0,l.yg)("inlineCode",{parentName:"p"},"uuidv4"),", the\nbundle will get redeployed."),(0,l.yg)("p",null,"The template context has the following keys:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterValues")," are retrieved from target cluster's ",(0,l.yg)("inlineCode",{parentName:"li"},"spec.templateValues")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterLabels")," and ",(0,l.yg)("inlineCode",{parentName:"li"},".ClusterAnnotations")," are the labels and annotations in\nthe cluster resource."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterName")," as the fleet's cluster resource name."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterNamespace")," as the namespace in which the cluster resource exists.")),(0,l.yg)("p",null,"To access Labels or Annotations by their key name:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},'${ get .ClusterLabels "management.cattle.io/cluster-display-name" }\n')),(0,l.yg)("p",null,"Note: The fleet.yaml must be valid yaml. Templating uses ",(0,l.yg)("inlineCode",{parentName:"p"},"${ }")," as delims,\nunlike Helm which uses ",(0,l.yg)("inlineCode",{parentName:"p"},"{{ }}"),". These fleet.yaml template delimiters can be\nescaped using backticks, eg.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${`${PWD}`}\n")),(0,l.yg)("p",null,"will result in the following text:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${PWD}\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6417316b.3cb8935c.js b/assets/js/6417316b.3cb8935c.js deleted file mode 100644 index c293eeefc..000000000 --- a/assets/js/6417316b.3cb8935c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1489],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>h});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=u(n),m=l,h=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?a.createElement(h,r(r({ref:t},c),{},{components:n})):a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,r=new Array(o);r[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:l,r[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(8168),l=(n(6540),n(5680));const o={},r="fleet.yaml",i={unversionedId:"ref-fleet-yaml",id:"version-0.10/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a",source:"@site/versioned_docs/version-0.10/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.10/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-fleet-yaml.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.10/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.10/ref-gitrepo"}},s={},u=[{value:"Reference",id:"reference",level:3},{value:"Helm Options",id:"helm-options",level:3},{value:"How fleet-agent deploys the bundle",id:"how-fleet-agent-deploys-the-bundle",level:4},{value:"Helm Chart Download Options",id:"helm-chart-download-options",level:4},{value:"Helm Chart Value Options",id:"helm-chart-value-options",level:4},{value:"Templating",id:"templating",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a\n",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,l.yg)("p",null,"For more information on how to use the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see\n",(0,l.yg)("a",{parentName:"p",href:"/0.10/gitrepo-content"},"Git Repository Contents"),"."),(0,l.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at\n",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),",\nwhich contains the ",(0,l.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,l.yg)("h3",{id:"reference"},"Reference"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified in\n# the manifests.\n#\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n#\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by\n# Fleet.\nnamespaceLabels:\n key: value\n\n# namespaceAnnotations are annotations that will be appended to the namespace\n# created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain a\n # kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n\n # These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter\n # URL or OCI registry based helm chart URL e.g.\n # "oci://ghcr.io/fleetrepoci/guestbook". This allows one to download charts\n # from most any location. Also know that go-getter URL supports adding a\n # digest to validate the download. If repo is set below this field is the name\n # of the chart to lookup.\n #\n # It is possible to download the chart from a Git repository, e.g. by using\n # `git@github.com:rancher/fleet-examples//single-cluster/helm`. If a secret\n # for the SSH key was defined in the GitRepo via `helmSecretName`, it will be\n # injected into the chart URL.\n #\n # Git repositories can be downloaded via unauthenticated http, by using for\n # example:\n #\n # `git::http://github.com/rancher/fleet-examples/single-cluster/helm`.\n chart: ./chart\n\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm\n # repository.\n repo: https://charts.rancher.io\n\n # The version of the chart or semver constraint of the chart to find. If a\n # constraint is specified it is evaluated each time git changes.\n #\n # The version also determines which chart to download from OCI registries.\n # Note: OCI registries don\'t support the \'+\' character, which is supported by\n # semver. When pushing a helm chart with a tag containing the \'+\' character\n # helm automatically replaces \'+\' to \'_\' before uploading it.\n #\n # You should use the version with the \'+\' in this file, as the \'_\' character\n # is not supported by semver and Fleet also replaces \'+\' to \'_\' when accessing\n # the OCI registry.\n version: 0.1.0\n\n # By default fleet downloads any dependency found in a helm chart. Use\n # disableDependencyUpdate: true to disable this feature.\n disableDependencyUpdate: false\n\n ### These options only work for helm-type bundles.\n #\n # Any values that should be placed in the `values.yaml` and passed to helm\n # during install.\n values:\n\n any-custom: value\n\n # All labels on Rancher clusters are available using\n # global.fleet.clusterLabels.LABELNAME These can now be accessed directly as\n # variables The variable\'s value will be an empty string if the referenced\n # cluster label does not exist on the targeted cluster.\n variableName: global.fleet.clusterLabels.LABELNAME\n\n # See Templating notes below for more information on templating.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n\n # Path to any values files that need to be passed to helm during install.\n valuesFiles:\n - values1.yaml\n - values2.yaml\n\n # Allow to use values files from configmaps or secrets defined in the\n # downstream clusters.\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply\n ### for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n #\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n #\n # Override immutable resources. This could be dangerous.\n force: false\n #\n # Set the Helm --atomic flag when upgrading\n atomic: false\n #\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n #\n # Disable DNS resolution in Helm\'s template functions\n disableDNS: false\n #\n # Skip evaluation of the values.schema.json file\n skipSchemaValidation: false\n #\n # If set and timeoutSeconds provided, will wait until all Jobs have been\n # completed before marking the GitRepo as ready. It will wait for as long as\n # timeoutSeconds.\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n#\n# Default: false\npaused: false\n\nrolloutStrategy:\n\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n #\n # default: 100%\n maxUnavailable: 15%\n\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n #\n # default: 0\n maxUnavailablePartitions: 20%\n\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n #\n # default: 25%\n autoPartitionSize: 10%\n\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n\n # A cluster group name to include in this partition\n clusterGroup: agroup\n\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified\n# per target Targets are evaluated in order and the first one to match a cluster\n# is used for that cluster.\ntargetCustomizations:\n\n # The name of target. If not specified a default name of the format\n # "target000" will be used. This value is mostly for display\n - name: prod\n\n # Custom namespace value overriding the value at the root.\n namespace: newvalue\n\n # Custom defaultNamespace value overriding the value at the root.\n defaultNamespace: newdefaultvalue\n\n # Custom kustomize options overriding the options at the root.\n kustomize: {}\n\n # Custom Helm options override the options at the root.\n helm: {}\n\n # If using raw YAML these are names that map to overlays/{name} that will be\n # used to replace or patch a resource. If you wish to customize the file\n # ./subdir/resource.yaml then a file\n # ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A\n # file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the\n # base file. A patch can in JSON Patch or JSON Merge format or a strategic\n # merge patch for builtin Kubernetes types. Refer to "Raw YAML Resource\n # Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is\n # specified, clusterSelector will be used only to further refine the\n # selection after clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io\n # resource.\n clusterName: dev-cluster\n\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n\n # A specific clusterGroup by name that will be selected.\n clusterGroup: group1\n\n # Resources will not be deployed in the matched clusters if doNotDeploy is\n # true.\n doNotDeploy: false\n\n # Drift correction removes any external change made to resources managed by\n # Fleet. It performs a helm rollback, which uses a three-way merge strategy\n # by default. It will try to update all resources by doing a PUT request if\n # force is enabled. Three-way strategic merge might fail when updating an\n # item inside of an array as it will try to add a new item instead of\n # replacing the existing one. This can be fixed by using force. Keep in\n # mind that resources might be recreated if force is enabled. Failed\n # rollback will be removed from the helm history unless keepFailHistory is\n # set to true.\n correctDrift:\n enabled: false\n force: false # Warning: it might recreate resources if set to true\n keepFailHistory: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current\n# bundle will only be deployed, after all dependencies are deployed and in a\n# Ready state.\ndependsOn:\n\n # Format:\n # - with all path separators replaced by "-"\n #\n # Example:\n #\n # GitRepo name "one", Bundle path "/multi-cluster/hello-world"\n # results in "one-multi-cluster-hello-world".\n #\n # Note:\n #\n # Bundle names are limited to 53 characters long. If longer they will be\n # shortened:\n #\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes\n # opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks\n# some conditions in Custom Resources makes the Bundle to be in an error state\n# when it shouldn\'t.\nignore:\n\n # Conditions to be ignored\n conditions:\n\n # In this example a condition will be ignored if it contains\n # {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets\n# from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n')),(0,l.yg)("h3",{id:"helm-options"},"Helm Options"),(0,l.yg)("h4",{id:"how-fleet-agent-deploys-the-bundle"},"How fleet-agent deploys the bundle"),(0,l.yg)("p",null,"These options also apply to kustomize- and manifest-style bundles. They control\nhow the fleet-agent deploys the bundle. All bundles are converted into Helm\ncharts and deployed with the Helm SDK. These options are often similar to the\nHelm CLI options for install and update."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"releaseName"),(0,l.yg)("li",{parentName:"ul"},"takeOwnership"),(0,l.yg)("li",{parentName:"ul"},"force"),(0,l.yg)("li",{parentName:"ul"},"atomic"),(0,l.yg)("li",{parentName:"ul"},"disablePreProcess"),(0,l.yg)("li",{parentName:"ul"},"disableDNS"),(0,l.yg)("li",{parentName:"ul"},"skipSchemaValidation"),(0,l.yg)("li",{parentName:"ul"},"waitForJobs")),(0,l.yg)("h4",{id:"helm-chart-download-options"},"Helm Chart Download Options"),(0,l.yg)("p",null,"These options are for Helm-style bundles, they specify how to download the\nchart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"chart"),(0,l.yg)("li",{parentName:"ul"},"repo"),(0,l.yg)("li",{parentName:"ul"},"version")),(0,l.yg)("p",null,"The reference to the chart can be either:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"a local path in the cloned Git repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),"."),(0,l.yg)("li",{parentName:"ul"},"a ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/hashicorp/go-getter?tab=readme-ov-file#url-format"},"go-getter URL"),",\nspecified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),". This can be used to download a tarball\nof the chart. go-getter also allows to download a chart from a Git repo."),(0,l.yg)("li",{parentName:"ul"},"a Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),"."),(0,l.yg)("li",{parentName:"ul"},"an OCI Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),".")),(0,l.yg)("h4",{id:"helm-chart-value-options"},"Helm Chart Value Options"),(0,l.yg)("p",null,"Options for the downloaded Helm chart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"values"),(0,l.yg)("li",{parentName:"ul"},"valuesFiles"),(0,l.yg)("li",{parentName:"ul"},"valueFrom")),(0,l.yg)("h3",{id:"templating"},"Templating"),(0,l.yg)("p",null,"It is possible to specify the keys and values as go template strings for\nadvanced templating needs. Most of the functions from the ",(0,l.yg)("a",{parentName:"p",href:"https://masterminds.github.io/sprig/"},"sprig templating\nlibrary")," are available."),(0,l.yg)("p",null,"Note that if the functions output changes with every call, e.g. ",(0,l.yg)("inlineCode",{parentName:"p"},"uuidv4"),", the\nbundle will get redeployed."),(0,l.yg)("p",null,"The template context has the following keys:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterValues")," are retrieved from target cluster's ",(0,l.yg)("inlineCode",{parentName:"li"},"spec.templateValues")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterLabels")," and ",(0,l.yg)("inlineCode",{parentName:"li"},".ClusterAnnotations")," are the labels and annotations in\nthe cluster resource."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterName")," as the fleet's cluster resource name."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterNamespace")," as the namespace in which the cluster resource exists.")),(0,l.yg)("p",null,"To access Labels or Annotations by their key name:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},'${ get .ClusterLabels "management.cattle.io/cluster-display-name" }\n')),(0,l.yg)("p",null,"Note: The fleet.yaml must be valid yaml. Templating uses ",(0,l.yg)("inlineCode",{parentName:"p"},"${ }")," as delims,\nunlike Helm which uses ",(0,l.yg)("inlineCode",{parentName:"p"},"{{ }}"),". These fleet.yaml template delimiters can be\nescaped using backticks, eg.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${`${PWD}`}\n")),(0,l.yg)("p",null,"will result in the following text:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${PWD}\n")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/64b4770e.12698e3f.js b/assets/js/64b4770e.12698e3f.js new file mode 100644 index 000000000..f21947a8c --- /dev/null +++ b/assets/js/64b4770e.12698e3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2008],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>y});var a=t(6540);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(t),u=l,y=d["".concat(s,".").concat(u)]||d[u]||c[u]||r;return t?a.createElement(y,i(i({ref:n},m),{},{components:t})):a.createElement(y,i({ref:n},m))}));function y(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,i=new Array(r);i[0]=u;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:l,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>o,toc:()=>p});var a=t(8168),l=(t(6540),t(5680));const r={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.8/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.8/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.8/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/gitrepo-content.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.8/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.8/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],m={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,l.yg)(d,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,l.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,l.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,l.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,l.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,l.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,l.yg)("p",null,"Multiple paths can be defined for a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,l.yg)("a",{parentName:"p",href:"/0.8/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,l.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"File"),(0,l.yg)("th",{parentName:"tr",align:null},"Location"),(0,l.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,l.yg)("a",{parentName:"td",href:"/0.8/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"}," *.yaml ")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If a ",(0,l.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,l.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")),(0,l.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,l.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,l.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,l.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,l.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,l.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,l.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,l.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,l.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,l.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,l.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,l.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,l.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,l.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,l.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")),(0,l.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,l.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,l.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,l.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,l.yg)("li",{parentName:"ul"},"Multiple ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,l.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,l.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Double asterisks (",(0,l.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,l.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,l.yg)("inlineCode",{parentName:"li"},"!"))),(0,l.yg)("h2",{id:"fleetyaml"},(0,l.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,l.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,l.yg)("a",{parentName:"p",href:"/0.8/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,l.yg)("p",null,"The available fields are documented in the ",(0,l.yg)("a",{parentName:"p",href:"/0.8/ref-fleet-yaml"},"fleet.yaml reference")),(0,l.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,l.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,l.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,l.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,l.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,l.yg)("p",null,"These examples showcase the style and format for using ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,l.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,l.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,l.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,l.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,l.yg)("p",null,"The resources can then be referenced from a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,l.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,l.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,l.yg)("p",null,"There are three approaches to matching clusters for both ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,l.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,l.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,l.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,l.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,l.yg)("p",null,"When using Kustomize or Helm the ",(0,l.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,l.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,l.yg)("p",null,"A file named ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,l.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,l.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/65f1dd3d.0771566e.js b/assets/js/65f1dd3d.0771566e.js new file mode 100644 index 000000000..140f4bfbf --- /dev/null +++ b/assets/js/65f1dd3d.0771566e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8086],{5680:(e,t,a)=>{a.d(t,{xA:()=>n,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var c=r.createContext({}),d=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},n=function(e){var t=d(e.components);return r.createElement(c.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,c=e.parentName,n=o(e,["components","mdxType","originalType","parentName"]),h=d(a),p=l,m=h["".concat(c,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},n),{},{components:a})):r.createElement(m,i({ref:t},n))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.10.0",date:"2024-07-17 11:54:57 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.10.0",id:"version-0.10/changelogs/changelogs/v0.10.0",title:"v0.10.0",description:"(github-actions[bot]) released this 2024-07-17 1157 +0000 UTC",source:"@site/versioned_docs/version-0.10/changelogs/changelogs/v0.10.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.10.0",permalink:"/0.10/changelogs/changelogs/v0.10.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/changelogs/changelogs/v0.10.0.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.10.0",date:"2024-07-17 11:54:57 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.10/troubleshooting"}},c={},d=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],n={toc:d},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},n,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(github-actions","[bot]",") released this 2024-07-17 11:54:57 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("p",null,'The Fleet v0.10 release brings significant changes, including a redesign that splits components into containers and switches to the controller-runtime framework. The rewritten controllers switch to structured logging. To reduce image size and complexity, v0.10 integrates the gitjob repository, merges various controller codes, and introduces new features such as sharding with node selectors, prometheus metrics, configurable leader election, and worker count for the fleet-controller. The release deprecates the "fleet test" command in favor of \u201ctarget\u201d and \u201cdeploy\u201d with a dry-run option and adds experimental OCI content storage. Bug fixes enhance drift detection, cluster status reporting, and various operational aspects, while automation improvements bolster testing, CI, and the release workflow.'),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Populate bundle status from bundleDeployment status resources by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2359733673","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2535","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2535/hovercard",href:"https://github.com/rancher/fleet/pull/2535"},"#2535")),(0,l.yg)("li",null,"Add strict TLS mode support by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2346800281","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2507","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2507/hovercard",href:"https://github.com/rancher/fleet/pull/2507"},"#2507")),(0,l.yg)("li",null,"Adding NodeSelection for Controller Shards by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2345997673","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2505","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2505/hovercard",href:"https://github.com/rancher/fleet/pull/2505"},"#2505")),(0,l.yg)("li",null,"Extend strict TLS mode to ",(0,l.yg)("code",null,"fleet-agent")," container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2375511059","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2556","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2556/hovercard",href:"https://github.com/rancher/fleet/pull/2556"},"#2556")),(0,l.yg)("li",null,"Gitcloner recurses submodules by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2375658491","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2557","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2557/hovercard",href:"https://github.com/rancher/fleet/pull/2557"},"#2557")),(0,l.yg)("li",null,"Bundle content storage in OCI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2377863655","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2561","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2561/hovercard",href:"https://github.com/rancher/fleet/pull/2561"},"#2561")),(0,l.yg)("li",null,"Add metrics to gitops controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2357506168","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2530","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2530/hovercard",href:"https://github.com/rancher/fleet/pull/2530"},"#2530")),(0,l.yg)("li",null,"Use bundleDeployment to store resources in gitRepo status by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353413909","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2523","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2523/hovercard",href:"https://github.com/rancher/fleet/pull/2523"},"#2523")),(0,l.yg)("li",null,"Adds extraEnv to gitjob and fleet-controller deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2339834946","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2493","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2493/hovercard",href:"https://github.com/rancher/fleet/pull/2493"},"#2493")),(0,l.yg)("li",null,'Deprecate "fleet test" command, previously used to debug chart by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109938878","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2113","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2113/hovercard",href:"https://github.com/rancher/fleet/pull/2113"},"#2113")),(0,l.yg)("li",null,"Support for Azure DevOps Webhook for gitRepos using SSH URL by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2302912587","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2440","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2440/hovercard",href:"https://github.com/rancher/fleet/pull/2440"},"#2440")),(0,l.yg)("li",null,"Keep CRDs when deleting a Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2048225166","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2028","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2028/hovercard",href:"https://github.com/rancher/fleet/pull/2028"},"#2028")),(0,l.yg)("li",null,"Add correctDrift to targetCustomization by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2042071087","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2014","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2014/hovercard",href:"https://github.com/rancher/fleet/pull/2014"},"#2014")),(0,l.yg)("li",null,"Add target/deploy/dry-run CLI commands by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2102603594","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2102","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2102/hovercard",href:"https://github.com/rancher/fleet/pull/2102"},"#2102")),(0,l.yg)("li",null,"Adds option to disable polling for Git repos by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2186660640","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2226","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2226/hovercard",href:"https://github.com/rancher/fleet/pull/2226"},"#2226")),(0,l.yg)("li",null,"Only create Content resource if Bundle matches any target by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2194894549","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2239","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2239/hovercard",href:"https://github.com/rancher/fleet/pull/2239"},"#2239")),(0,l.yg)("li",null,"Removes cluster node status reporting from agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2161135650","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2190","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2190/hovercard",href:"https://github.com/rancher/fleet/pull/2190"},"#2190")),(0,l.yg)("li",null,"Merge controller and gitjob images by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2192725776","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2236","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2236/hovercard",href:"https://github.com/rancher/fleet/pull/2236"},"#2236")),(0,l.yg)("li",null,"Add static sharding support by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2237854834","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2323","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2323/hovercard",href:"https://github.com/rancher/fleet/pull/2323"},"#2323")),(0,l.yg)("li",null,"Add Prometheus Metrics by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2149350063","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2172","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2172/hovercard",href:"https://github.com/rancher/fleet/pull/2172"},"#2172")),(0,l.yg)("li",null,"Merge binaries by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2258819339","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2361","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2361/hovercard",href:"https://github.com/rancher/fleet/pull/2361"},"#2361")),(0,l.yg)("li",null,"Configurable leader election via chart values by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2019010044","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1981","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1981/hovercard",href:"https://github.com/rancher/fleet/pull/1981"},"#1981")),(0,l.yg)("li",null,"Replace ImageScan and Bundle Labels With fleet.yaml Labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2258766508","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2360","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2360/hovercard",href:"https://github.com/rancher/fleet/pull/2360"},"#2360")),(0,l.yg)("li",null,"Reduce logging for bundles from cleanup controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2270843205","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2393","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2393/hovercard",href:"https://github.com/rancher/fleet/pull/2393"},"#2393")),(0,l.yg)("li",null,"Delete namespace when a gitRepo is deleted by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2263938587","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2373","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2373/hovercard",href:"https://github.com/rancher/fleet/pull/2373"},"#2373")),(0,l.yg)("li",null,"Add readOnlyRootFilesystem to deployment_gitjob.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2266039980","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2379","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2379/hovercard",href:"https://github.com/rancher/fleet/pull/2379"},"#2379")),(0,l.yg)("li",null,"Creation of a New Webhook endpoint for Github test Webhook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2271194744","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2395","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2395/hovercard",href:"https://github.com/rancher/fleet/pull/2395"},"#2395")),(0,l.yg)("li",null,"Add a Parameter to Configure Worker count for fleet-controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2295399357","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2430","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2430/hovercard",href:"https://github.com/rancher/fleet/pull/2430"},"#2430"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Ignore status fields during drift detection by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353297690","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2522","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2522/hovercard",href:"https://github.com/rancher/fleet/pull/2522"},"#2522")),(0,l.yg)("li",null,"Fixes error display and improves user experience in git poller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2364796802","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2542","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2542/hovercard",href:"https://github.com/rancher/fleet/pull/2542"},"#2542")),(0,l.yg)("li",null,"Honor Helm's MaxHistory when using drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353133742","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2519","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2519/hovercard",href:"https://github.com/rancher/fleet/pull/2519"},"#2519")),(0,l.yg)("li",null,"Remove trailing comma from bootstrap template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Danil-Grigorev/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Danil-Grigorev"},"@Danil-Grigorev")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2310946848","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2452","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2452/hovercard",href:"https://github.com/rancher/fleet/pull/2452"},"#2452")),(0,l.yg)("li",null,"Do not count deleted bundledeployments in cluster status by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2311041603","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2454","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2454/hovercard",href:"https://github.com/rancher/fleet/pull/2454"},"#2454")),(0,l.yg)("li",null,"Fixes infinite job generation after ForceSyncGeneration changed by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2328068352","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2477","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2477/hovercard",href:"https://github.com/rancher/fleet/pull/2477"},"#2477")),(0,l.yg)("li",null,"GitRepo Initial Checkout when DisablePolling is True by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2323168608","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2469","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2469/hovercard",href:"https://github.com/rancher/fleet/pull/2469"},"#2469")),(0,l.yg)("li",null,"Filter namespaces by the kubernetes.io/metadata.name label by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2037858779","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2009","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2009/hovercard",href:"https://github.com/rancher/fleet/pull/2009"},"#2009")),(0,l.yg)("li",null,"Catch OCI version errors and return them by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2233104104","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2311","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2311/hovercard",href:"https://github.com/rancher/fleet/pull/2311"},"#2311")),(0,l.yg)("li",null,"Make AlphabeticalPolicy string check case insensitive by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aditditto/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aditditto"},"@aditditto")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2177749060","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2216","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2216/hovercard",href:"https://github.com/rancher/fleet/pull/2216"},"#2216")),(0,l.yg)("li",null,"Ignore not-found errors when deleting bundle deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2243969846","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2329","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2329/hovercard",href:"https://github.com/rancher/fleet/pull/2329"},"#2329")),(0,l.yg)("li",null,"Bump helm fork to 3.14.4 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2248481670","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2337","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2337/hovercard",href:"https://github.com/rancher/fleet/pull/2337"},"#2337")),(0,l.yg)("li",null,"Add missing serviceName in fleet-agent statefulset by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2066967037","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2045","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2045/hovercard",href:"https://github.com/rancher/fleet/pull/2045"},"#2045")),(0,l.yg)("li",null,"Fix gitjob log messages for controller and webhook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2261711418","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2367","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2367/hovercard",href:"https://github.com/rancher/fleet/pull/2367"},"#2367")),(0,l.yg)("li",null,"Fix helm deployer ignoring kubeconfig CLI arg by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109931596","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2112","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2112/hovercard",href:"https://github.com/rancher/fleet/pull/2112"},"#2112")),(0,l.yg)("li",null,"Return commit for revision instead of HEAD by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2280236862","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2410","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2410/hovercard",href:"https://github.com/rancher/fleet/pull/2410"},"#2410")),(0,l.yg)("li",null,"Merges gitrepo and gitops controllers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2361700242","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2537","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2537/hovercard",href:"https://github.com/rancher/fleet/pull/2537"},"#2537")),(0,l.yg)("li",null,"Partially replace cleanup with finalizers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2295817557","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2431","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2431/hovercard",href:"https://github.com/rancher/fleet/pull/2431"},"#2431")),(0,l.yg)("li",null,"Moves functionality from gitrepo to gitjob controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2327173645","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2475","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2475/hovercard",href:"https://github.com/rancher/fleet/pull/2475"},"#2475"))),(0,l.yg)("h2",null,"Redesign"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Convert fleet-agent to controller-runtime by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1890835443","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1772","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1772/hovercard",href:"https://github.com/rancher/fleet/pull/1772"},"#1772")),(0,l.yg)("li",null,"Convert fleetcontroller to controller-runtime by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2044137960","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2018","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2018/hovercard",href:"https://github.com/rancher/fleet/pull/2018"},"#2018")),(0,l.yg)("li",null,"Move ",(0,l.yg)("code",null,"rancher/gitjob")," logic to this repository by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2095804246","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2098","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2098/hovercard",href:"https://github.com/rancher/fleet/pull/2098"},"#2098")),(0,l.yg)("li",null,"Split fleet-agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1963911966","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1905","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1905/hovercard",href:"https://github.com/rancher/fleet/pull/1905"},"#1905")),(0,l.yg)("li",null,"Switch container images to busybox and suse/git by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1995107905","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1940","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1940/hovercard",href:"https://github.com/rancher/fleet/pull/1940"},"#1940")),(0,l.yg)("li",null,"Remove ",(0,l.yg)("code",null,"GitJob")," resource by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2122902006","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2129","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2129/hovercard",href:"https://github.com/rancher/fleet/pull/2129"},"#2129")),(0,l.yg)("li",null,"Clustergroup controller migration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2275478825","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2400","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2400/hovercard",href:"https://github.com/rancher/fleet/pull/2400"},"#2400"))),(0,l.yg)("h2",null,"Performance"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Reduce the number of times that Bundle resources are serialized by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2005837884","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1952","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1952/hovercard",href:"https://github.com/rancher/fleet/pull/1952"},"#1952")),(0,l.yg)("li",null,"Replace json-based implementation of DeepCopy on GenericMap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1968315954","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1915","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1915/hovercard",href:"https://github.com/rancher/fleet/pull/1915"},"#1915"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("details",null,(0,l.yg)("ul",null,(0,l.yg)("li",null,"Keep schemebuilder type by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353647765","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2524","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2524/hovercard",href:"https://github.com/rancher/fleet/pull/2524"},"#2524")),(0,l.yg)("li",null,"Rename sharding labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2318944636","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2463","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2463/hovercard",href:"https://github.com/rancher/fleet/pull/2463"},"#2463")),(0,l.yg)("li",null,"Fix ",(0,l.yg)("code",null,"fleet apply")," command description by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2323057075","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2467","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2467/hovercard",href:"https://github.com/rancher/fleet/pull/2467"},"#2467")),(0,l.yg)("li",null,"Fix example values.yaml for enabling OCI storage by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/bigkevmcd/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/bigkevmcd"},"@bigkevmcd")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2340004325","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2494","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2494/hovercard",href:"https://github.com/rancher/fleet/pull/2494"},"#2494")),(0,l.yg)("li",null,"Refactor Gitops Controllers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2337990026","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2490","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2490/hovercard",href:"https://github.com/rancher/fleet/pull/2490"},"#2490")),(0,l.yg)("li",null,"Add authorize and defaults to gitjob controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2338496650","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2491","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2491/hovercard",href:"https://github.com/rancher/fleet/pull/2491"},"#2491")),(0,l.yg)("li",null,"Security context needs to be on container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2346033378","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2506","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2506/hovercard",href:"https://github.com/rancher/fleet/pull/2506"},"#2506")),(0,l.yg)("li",null,"Adds DeleteFunc to bundle's predicate in gitrepo's controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2348301743","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2508","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2508/hovercard",href:"https://github.com/rancher/fleet/pull/2508"},"#2508")),(0,l.yg)("li",null,"Add SecurityContext to job container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1941789294","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1860","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1860/hovercard",href:"https://github.com/rancher/fleet/pull/1860"},"#1860")),(0,l.yg)("li",null,'Revert "Add SecurityContext to job container" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1945542519","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1872","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1872/hovercard",href:"https://github.com/rancher/fleet/pull/1872"},"#1872")),(0,l.yg)("li",null,"Add SecurityContext to job container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1946998946","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1875","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1875/hovercard",href:"https://github.com/rancher/fleet/pull/1875"},"#1875")),(0,l.yg)("li",null,"Add security context to token cleanup job by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/puffitos/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/puffitos"},"@puffitos")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1944032796","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1862","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1862/hovercard",href:"https://github.com/rancher/fleet/pull/1862"},"#1862")),(0,l.yg)("li",null,"Drop wrangler-cli dependency by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1956784131","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1896","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1896/hovercard",href:"https://github.com/rancher/fleet/pull/1896"},"#1896")),(0,l.yg)("li",null,"Small refactor of debug flags handling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1957497508","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1899","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1899/hovercard",href:"https://github.com/rancher/fleet/pull/1899"},"#1899")),(0,l.yg)("li",null,"Move cleanup to a different container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1954439986","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1885","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1885/hovercard",href:"https://github.com/rancher/fleet/pull/1885"},"#1885")),(0,l.yg)("li",null,"Fix typo in README.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/guitarmanvt/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/guitarmanvt"},"@guitarmanvt")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1964022349","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1907","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1907/hovercard",href:"https://github.com/rancher/fleet/pull/1907"},"#1907")),(0,l.yg)("li",null,"Replace wrangler for kubebuilder for generating CRDs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1963848717","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1904","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1904/hovercard",href:"https://github.com/rancher/fleet/pull/1904"},"#1904")),(0,l.yg)("li",null,"Remove leftovers from controller-gen migration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1970291711","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1920","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1920/hovercard",href:"https://github.com/rancher/fleet/pull/1920"},"#1920")),(0,l.yg)("li",null,"Fix debug flag in agent commands by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1974427291","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1924","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1924/hovercard",href:"https://github.com/rancher/fleet/pull/1924"},"#1924")),(0,l.yg)("li",null,"Move agent management to a separate container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1965739264","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1910","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1910/hovercard",href:"https://github.com/rancher/fleet/pull/1910"},"#1910")),(0,l.yg)("li",null,"Improve pull request template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1996262122","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1941","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1941/hovercard",href:"https://github.com/rancher/fleet/pull/1941"},"#1941")),(0,l.yg)("li",null,"Add docs link by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2002340456","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1951","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1951/hovercard",href:"https://github.com/rancher/fleet/pull/1951"},"#1951")),(0,l.yg)("li",null,"Change variables to constants in bundle type by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2020563266","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1986","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1986/hovercard",href:"https://github.com/rancher/fleet/pull/1986"},"#1986")),(0,l.yg)("li",null,"Agent Bundle/Release Cleanup Ignores Non-Fleet Releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2014984111","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1976","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1976/hovercard",href:"https://github.com/rancher/fleet/pull/1976"},"#1976")),(0,l.yg)("li",null,"Move agentmanagement modules into its folder by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2052187498","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2032","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2032/hovercard",href:"https://github.com/rancher/fleet/pull/2032"},"#2032")),(0,l.yg)("li",null,"Improve container security by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2065607849","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2042","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2042/hovercard",href:"https://github.com/rancher/fleet/pull/2042"},"#2042")),(0,l.yg)("li",null,"Remove bd requeue, rely on drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2020559622","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1985","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1985/hovercard",href:"https://github.com/rancher/fleet/pull/1985"},"#1985")),(0,l.yg)("li",null,"Remove k8s replace from go.mod by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2086110636","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2086","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2086/hovercard",href:"https://github.com/rancher/fleet/pull/2086"},"#2086")),(0,l.yg)("li",null,"Use apimachinery yaml package directly by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2098324130","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2099","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2099/hovercard",href:"https://github.com/rancher/fleet/pull/2099"},"#2099")),(0,l.yg)("li",null,"Extract apply to applied by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2094168503","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2097","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2097/hovercard",href:"https://github.com/rancher/fleet/pull/2097"},"#2097")),(0,l.yg)("li",null,"Refactor targeting/bundle controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109926921","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2111","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2111/hovercard",href:"https://github.com/rancher/fleet/pull/2111"},"#2111")),(0,l.yg)("li",null,"Use git-core pkg instead of git by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2107459241","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2105","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2105/hovercard",href:"https://github.com/rancher/fleet/pull/2105"},"#2105")),(0,l.yg)("li",null,"Update helm fork, rename ForceAdopt/Adopt to TakeOwnership by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2132126024","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2146","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2146/hovercard",href:"https://github.com/rancher/fleet/pull/2146"},"#2146")),(0,l.yg)("li",null,"Move ",(0,l.yg)("code",null,"gitjob")," binary to ",(0,l.yg)("code",null,"internal/cmd")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2132258848","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2148","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2148/hovercard",href:"https://github.com/rancher/fleet/pull/2148"},"#2148")),(0,l.yg)("li",null,"Cleanup unused durations constants by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/jhoblitt/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/jhoblitt"},"@jhoblitt")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2226398605","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2286","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2286/hovercard",href:"https://github.com/rancher/fleet/pull/2286"},"#2286")),(0,l.yg)("li",null,"Propagate bundle and bundledeployment status updates to GitRepo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2179603905","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2223","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2223/hovercard",href:"https://github.com/rancher/fleet/pull/2223"},"#2223")),(0,l.yg)("li",null,"Remove Windows agent image and docs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2192743853","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2237","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2237/hovercard",href:"https://github.com/rancher/fleet/pull/2237"},"#2237")),(0,l.yg)("li",null,"Remove manifest templates by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2191857570","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2233","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2233/hovercard",href:"https://github.com/rancher/fleet/pull/2233"},"#2233")),(0,l.yg)("li",null,"Switch fetchNamespace to Get instead of list by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2166745312","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2205","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2205/hovercard",href:"https://github.com/rancher/fleet/pull/2205"},"#2205")),(0,l.yg)("li",null,"Switch fleet repo branch to main by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2195475786","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2240","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2240/hovercard",href:"https://github.com/rancher/fleet/pull/2240"},"#2240")),(0,l.yg)("li",null,"Use portable API for bind mounts in integration tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188779861","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2229","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2229/hovercard",href:"https://github.com/rancher/fleet/pull/2229"},"#2229")),(0,l.yg)("li",null,"Controller image only install ssh clients by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2248079706","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2335","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2335/hovercard",href:"https://github.com/rancher/fleet/pull/2335"},"#2335")),(0,l.yg)("li",null,"Remove unused update status code from bundle reconciler by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2256160466","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2349","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2349/hovercard",href:"https://github.com/rancher/fleet/pull/2349"},"#2349")),(0,l.yg)("li",null,"Simplify shards configuration detection by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2258162224","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2354","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2354/hovercard",href:"https://github.com/rancher/fleet/pull/2354"},"#2354")),(0,l.yg)("li",null,"Switch to tini by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2248463028","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2336","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2336/hovercard",href:"https://github.com/rancher/fleet/pull/2336"},"#2336")),(0,l.yg)("li",null,"Hide global CLI flags on sub commands by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2265439033","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2376","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2376/hovercard",href:"https://github.com/rancher/fleet/pull/2376"},"#2376")),(0,l.yg)("li",null,"CLI deploy prints to stdout by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2311000996","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2453","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2453/hovercard",href:"https://github.com/rancher/fleet/pull/2453"},"#2453")),(0,l.yg)("li",null,"metrics: optimize collection calls in reconciliation loops by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2277897649","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2406","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2406/hovercard",href:"https://github.com/rancher/fleet/pull/2406"},"#2406")),(0,l.yg)("li",null,"Refactoring CreateJob and UpdateStatus methos in Gitjob Reconciler by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2299764247","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2434","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2434/hovercard",href:"https://github.com/rancher/fleet/pull/2434"},"#2434")),(0,l.yg)("li",null,"Gitjob controller updates GitRepo with generation it is reconciling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2310909354","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2451","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2451/hovercard",href:"https://github.com/rancher/fleet/pull/2451"},"#2451")))),(0,l.yg)("h2",null,"CI / Automation"),(0,l.yg)("details",null,(0,l.yg)("ul",null,(0,l.yg)("li",null,"Improve release api description and default by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2366117641","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2548","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2548/hovercard",href:"https://github.com/rancher/fleet/pull/2548"},"#2548")),(0,l.yg)("li",null,"Fix flaky e2e tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2362518175","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2539","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2539/hovercard",href:"https://github.com/rancher/fleet/pull/2539"},"#2539")),(0,l.yg)("li",null,"dev: Make setup-single-cluster capable of setting up multiple clusters by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2318907617","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2461","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2461/hovercard",href:"https://github.com/rancher/fleet/pull/2461"},"#2461")),(0,l.yg)("li",null,"Remove linter from release pipeline by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2378303360","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2562","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2562/hovercard",href:"https://github.com/rancher/fleet/pull/2562"},"#2562")),(0,l.yg)("li",null,"Fix flaky GitRepo status tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2359587594","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2534","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2534/hovercard",href:"https://github.com/rancher/fleet/pull/2534"},"#2534")),(0,l.yg)("li",null,"Include drift end-to-end tests in CI workflows by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2357560687","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2531","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2531/hovercard",href:"https://github.com/rancher/fleet/pull/2531"},"#2531")),(0,l.yg)("li",null,"Ignore typos in embedded file by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2356696655","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2528","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2528/hovercard",href:"https://github.com/rancher/fleet/pull/2528"},"#2528")),(0,l.yg)("li",null,"Switch from omg.howdoi.website to sslip.io by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2321037884","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2466","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2466/hovercard",href:"https://github.com/rancher/fleet/pull/2466"},"#2466")),(0,l.yg)("li",null,"Fix summary and details tags in bug report template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/sbulage/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/sbulage"},"@sbulage")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2327315302","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2476","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2476/hovercard",href:"https://github.com/rancher/fleet/pull/2476"},"#2476")),(0,l.yg)("li",null,"Increase timeout and waiting for testcontainers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2343689650","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2502","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2502/hovercard",href:"https://github.com/rancher/fleet/pull/2502"},"#2502")),(0,l.yg)("li",null,"Add status reconcile tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2283773180","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2416","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2416/hovercard",href:"https://github.com/rancher/fleet/pull/2416"},"#2416")),(0,l.yg)("li",null,"Fix flaky agent modified status test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2345749832","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2504","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2504/hovercard",href:"https://github.com/rancher/fleet/pull/2504"},"#2504")),(0,l.yg)("li",null,"E2e test to checks status fields by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2343861917","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2503","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2503/hovercard",href:"https://github.com/rancher/fleet/pull/2503"},"#2503")),(0,l.yg)("li",null,"Fixes flaky agent integration test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2348538604","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2509","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2509/hovercard",href:"https://github.com/rancher/fleet/pull/2509"},"#2509")),(0,l.yg)("li",null,"Use the same linter version in GoReleaser as for prs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2349162426","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2511","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2511/hovercard",href:"https://github.com/rancher/fleet/pull/2511"},"#2511")),(0,l.yg)("li",null,"Fix flaky integration test for git job with polling disabled by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2350332081","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2514","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2514/hovercard",href:"https://github.com/rancher/fleet/pull/2514"},"#2514")),(0,l.yg)("li",null,"Add tmate debugging info to Nightly E2E workflow by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1932553904","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1847","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1847/hovercard",href:"https://github.com/rancher/fleet/pull/1847"},"#1847")),(0,l.yg)("li",null,"Reduce replica count in rancher integration tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1929852102","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1840","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1840/hovercard",href:"https://github.com/rancher/fleet/pull/1840"},"#1840")),(0,l.yg)("li",null,"Remove cache action for Go build artifacts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1945000917","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1867","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1867/hovercard",href:"https://github.com/rancher/fleet/pull/1867"},"#1867")),(0,l.yg)("li",null,"Prevent debug images from creating GitHub releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1946780667","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1873","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1873/hovercard",href:"https://github.com/rancher/fleet/pull/1873"},"#1873")),(0,l.yg)("li",null,"Use configmap example for ",(0,l.yg)("code",null,"keepResources")," E2E tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1945350043","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1870","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1870/hovercard",href:"https://github.com/rancher/fleet/pull/1870"},"#1870")),(0,l.yg)("li",null,"Clean up e2e test resources by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1947082629","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1876","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1876/hovercard",href:"https://github.com/rancher/fleet/pull/1876"},"#1876")),(0,l.yg)("li",null,"Update exact Fleet version when releasing against Rancher by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1952352330","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1880","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1880/hovercard",href:"https://github.com/rancher/fleet/pull/1880"},"#1880")),(0,l.yg)("li",null,"Use private configmap chart for OCI testing by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1957212101","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1898","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1898/hovercard",href:"https://github.com/rancher/fleet/pull/1898"},"#1898")),(0,l.yg)("li",null,"Lower debug level in dev scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1963638015","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1903","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1903/hovercard",href:"https://github.com/rancher/fleet/pull/1903"},"#1903")),(0,l.yg)("li",null,"Fix flaky smoke test for cluster registration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1968035872","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1913","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1913/hovercard",href:"https://github.com/rancher/fleet/pull/1913"},"#1913")),(0,l.yg)("li",null,"Add acceptance tests to AKS and GKE CI workflows by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1968151102","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1914","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1914/hovercard",href:"https://github.com/rancher/fleet/pull/1914"},"#1914")),(0,l.yg)("li",null,"Make sure that all go.mods are tidy for new prs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1996298811","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1942","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1942/hovercard",href:"https://github.com/rancher/fleet/pull/1942"},"#1942")),(0,l.yg)("li",null,"Provide release.yaml charts version as array by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2012438999","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1971","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1971/hovercard",href:"https://github.com/rancher/fleet/pull/1971"},"#1971")),(0,l.yg)("li",null,"Switch bundle diff test to use random target namespaces by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2014372575","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1975","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1975/hovercard",href:"https://github.com/rancher/fleet/pull/1975"},"#1975")),(0,l.yg)("li",null,"Switch upgrade test to fleet-test-data repo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1992431831","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1936","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1936/hovercard",href:"https://github.com/rancher/fleet/pull/1936"},"#1936")),(0,l.yg)("li",null,"Remove s390x as runners are not available by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2024100159","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1995","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1995/hovercard",href:"https://github.com/rancher/fleet/pull/1995"},"#1995")),(0,l.yg)("li",null,"Add config for user/passwords in test infra by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2020905725","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1987","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1987/hovercard",href:"https://github.com/rancher/fleet/pull/1987"},"#1987")),(0,l.yg)("li",null,"Fix flaky gitrepo test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2030522456","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1999","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1999/hovercard",href:"https://github.com/rancher/fleet/pull/1999"},"#1999")),(0,l.yg)("li",null,"Add workflow for porting issues by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2041648810","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2012","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2012/hovercard",href:"https://github.com/rancher/fleet/pull/2012"},"#2012")),(0,l.yg)("li",null,"Use a different secret for GITHUB_TOKEN by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2043557441","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2016","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2016/hovercard",href:"https://github.com/rancher/fleet/pull/2016"},"#2016")),(0,l.yg)("li",null,"Adapt release script to build.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2043259249","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2015","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2015/hovercard",href:"https://github.com/rancher/fleet/pull/2015"},"#2015")),(0,l.yg)("li",null,"Add initial gitrepo controller integration test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2052784725","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2034","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2034/hovercard",href:"https://github.com/rancher/fleet/pull/2034"},"#2034")),(0,l.yg)("li",null,"Update CI up to k8s 1.29 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2081820873","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2073","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2073/hovercard",href:"https://github.com/rancher/fleet/pull/2073"},"#2073")),(0,l.yg)("li",null,"Disable cache in golangci-lint action by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2082403965","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2075","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2075/hovercard",href:"https://github.com/rancher/fleet/pull/2075"},"#2075")),(0,l.yg)("li",null,"Release scripts chart dir var by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2084413168","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2081","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2081/hovercard",href:"https://github.com/rancher/fleet/pull/2081"},"#2081")),(0,l.yg)("li",null,"Remove remaining s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2083721520","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2078","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2078/hovercard",href:"https://github.com/rancher/fleet/pull/2078"},"#2078")),(0,l.yg)("li",null,"Remove nightly image build by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2118784304","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2122","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2122/hovercard",href:"https://github.com/rancher/fleet/pull/2122"},"#2122")),(0,l.yg)("li",null,"Infra e2e command uses a published fleet module by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2127319651","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2137","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2137/hovercard",href:"https://github.com/rancher/fleet/pull/2137"},"#2137")),(0,l.yg)("li",null,"Add dev docs for changing the infra command by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2132221945","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2147","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2147/hovercard",href:"https://github.com/rancher/fleet/pull/2147"},"#2147")),(0,l.yg)("li",null,"Add gitjob end-to-end tests with SSH key by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109627478","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2109","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2109/hovercard",href:"https://github.com/rancher/fleet/pull/2109"},"#2109")),(0,l.yg)("li",null,"Add CI workflow releasing Fleet charts against a test repo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2227864431","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2296","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2296/hovercard",href:"https://github.com/rancher/fleet/pull/2296"},"#2296")),(0,l.yg)("li",null,"Add initial Renovate configuration by @renovate-rancher in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2224521380","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2274","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2274/hovercard",href:"https://github.com/rancher/fleet/pull/2274"},"#2274")),(0,l.yg)("li",null,"CI script to update fleet reset values by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202937276","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2261","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2261/hovercard",href:"https://github.com/rancher/fleet/pull/2261"},"#2261")),(0,l.yg)("li",null,"CI: Revert typos back to master by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2222518439","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2272","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2272/hovercard",href:"https://github.com/rancher/fleet/pull/2272"},"#2272")),(0,l.yg)("li",null,"Disable FOSSA check for RC releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2235139699","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2316","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2316/hovercard",href:"https://github.com/rancher/fleet/pull/2316"},"#2316")),(0,l.yg)("li",null,"Upgrade Fleet in Rancher only triggered manually by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2197306694","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2241","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2241/hovercard",href:"https://github.com/rancher/fleet/pull/2241"},"#2241")),(0,l.yg)("li",null,"Remove zube label handling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2222357941","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2270","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2270/hovercard",href:"https://github.com/rancher/fleet/pull/2270"},"#2270")),(0,l.yg)("li",null,"Replace Drone pipeline with Github actions by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2144033837","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2168","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2168/hovercard",href:"https://github.com/rancher/fleet/pull/2168"},"#2168")),(0,l.yg)("li",null,"Optimize renovate config by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2225725538","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2283","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2283/hovercard",href:"https://github.com/rancher/fleet/pull/2283"},"#2283")),(0,l.yg)("li",null,"Remove drone and dapper scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2167092697","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2207","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2207/hovercard",href:"https://github.com/rancher/fleet/pull/2207"},"#2207")),(0,l.yg)("li",null,"Do not mess up go toolchain during release by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2169305864","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2209","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2209/hovercard",href:"https://github.com/rancher/fleet/pull/2209"},"#2209")),(0,l.yg)("li",null,"Duplicate integrationtests scripts for devs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202423682","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2259","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2259/hovercard",href:"https://github.com/rancher/fleet/pull/2259"},"#2259")),(0,l.yg)("li",null,'Fix "Upgrade Fleet in Rancher To HEAD" CI by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202794521","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2260","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2260/hovercard",href:"https://github.com/rancher/fleet/pull/2260"},"#2260")),(0,l.yg)("li",null,"Fix Helm chart version computation in release workflow by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188219748","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2227","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2227/hovercard",href:"https://github.com/rancher/fleet/pull/2227"},"#2227")),(0,l.yg)("li",null,"Improve release scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2233316374","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2312","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2312/hovercard",href:"https://github.com/rancher/fleet/pull/2312"},"#2312")),(0,l.yg)("li",null,"Fixes for image reference and CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2200504121","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2253","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2253/hovercard",href:"https://github.com/rancher/fleet/pull/2253"},"#2253")),(0,l.yg)("li",null,"Improve release scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2237274685","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2321","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2321/hovercard",href:"https://github.com/rancher/fleet/pull/2321"},"#2321")),(0,l.yg)("li",null,"Bump Fleet version used within installation documentation to 0.9.3 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2249559463","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2338","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2338/hovercard",href:"https://github.com/rancher/fleet/pull/2338"},"#2338")),(0,l.yg)("li",null,"Make pre-release detection automatic by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2246220747","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2333","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2333/hovercard",href:"https://github.com/rancher/fleet/pull/2333"},"#2333")),(0,l.yg)("li",null,"Update dev/README Dockerfile for act container image by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2240210266","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2326","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2326/hovercard",href:"https://github.com/rancher/fleet/pull/2326"},"#2326")),(0,l.yg)("li",null,"Add developer docs for monitoring by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2161042895","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2189","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2189/hovercard",href:"https://github.com/rancher/fleet/pull/2189"},"#2189")),(0,l.yg)("li",null,"Publish to docker.io/rancher (",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno"),")"),(0,l.yg)("li",null,"Clean up metrics tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2269445338","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2387","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2387/hovercard",href:"https://github.com/rancher/fleet/pull/2387"},"#2387")),(0,l.yg)("li",null,"Remove go.mod from infra test setup command by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2265685027","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2378","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2378/hovercard",href:"https://github.com/rancher/fleet/pull/2378"},"#2378")),(0,l.yg)("li",null,"Simplify sharding end-to-end tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2271468604","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2396","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2396/hovercard",href:"https://github.com/rancher/fleet/pull/2396"},"#2396")),(0,l.yg)("li",null,"Remove go work section from dev README by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2266055045","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2380","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2380/hovercard",href:"https://github.com/rancher/fleet/pull/2380"},"#2380")),(0,l.yg)("li",null,"metrics: Add E2E test for cluster deletion by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2263563973","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2371","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2371/hovercard",href:"https://github.com/rancher/fleet/pull/2371"},"#2371")),(0,l.yg)("li",null,"Ignore gosec errors in end-to-end tests infra setup by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2270828693","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2392","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2392/hovercard",href:"https://github.com/rancher/fleet/pull/2392"},"#2392")),(0,l.yg)("li",null,"Add sharding to Fleet deployments in CI workflows running end-to-end tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2277427905","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2405","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2405/hovercard",href:"https://github.com/rancher/fleet/pull/2405"},"#2405")),(0,l.yg)("li",null,"dev-scripts: Change apiServerURL for setup-fleet-downstream by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2071940986","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2052","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2052/hovercard",href:"https://github.com/rancher/fleet/pull/2052"},"#2052")),(0,l.yg)("li",null,"Improve logging and document issue running ",(0,l.yg)("code",null,"act")," in a linked git worktree by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2263578613","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2372","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2372/hovercard",href:"https://github.com/rancher/fleet/pull/2372"},"#2372")),(0,l.yg)("li",null,"metrics: make sure metrics work well with sharding by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2285477953","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2420","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2420/hovercard",href:"https://github.com/rancher/fleet/pull/2420"},"#2420")),(0,l.yg)("li",null,"Re-enable fossa by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/olblak/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/olblak"},"@olblak")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2310005735","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2446","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2446/hovercard",href:"https://github.com/rancher/fleet/pull/2446"},"#2446")))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.5...v0.10.0"},(0,l.yg)("tt",null,"v0.9.5...v0.10.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-0.10.0.tgz"},"fleet-0.10.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-crd-0.10.0.tgz"},"fleet-crd-0.10.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-agent-0.10.0.tgz"},"fleet-agent-0.10.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet_0.10.0_checksums.txt"},"fleet_0.10.0_checksums.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-linux-amd64"},"fleet-linux-amd64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.10.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/65f1dd3d.0ff856cf.js b/assets/js/65f1dd3d.0ff856cf.js deleted file mode 100644 index f580f4baa..000000000 --- a/assets/js/65f1dd3d.0ff856cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8086],{5680:(e,t,a)=>{a.d(t,{xA:()=>n,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var c=r.createContext({}),d=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},n=function(e){var t=d(e.components);return r.createElement(c.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,c=e.parentName,n=o(e,["components","mdxType","originalType","parentName"]),h=d(a),p=l,m=h["".concat(c,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},n),{},{components:a})):r.createElement(m,i({ref:t},n))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.10.0",date:"2024-07-17 11:54:57 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.10.0",id:"version-0.10/changelogs/changelogs/v0.10.0",title:"v0.10.0",description:"(github-actions[bot]) released this 2024-07-17 1157 +0000 UTC",source:"@site/versioned_docs/version-0.10/changelogs/changelogs/v0.10.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.10.0",permalink:"/0.10/changelogs/changelogs/v0.10.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/changelogs/changelogs/v0.10.0.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.10.0",date:"2024-07-17 11:54:57 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.10/troubleshooting"}},c={},d=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],n={toc:d},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},n,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(github-actions","[bot]",") released this 2024-07-17 11:54:57 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("p",null,'The Fleet v0.10 release brings significant changes, including a redesign that splits components into containers and switches to the controller-runtime framework. The rewritten controllers switch to structured logging. To reduce image size and complexity, v0.10 integrates the gitjob repository, merges various controller codes, and introduces new features such as sharding with node selectors, prometheus metrics, configurable leader election, and worker count for the fleet-controller. The release deprecates the "fleet test" command in favor of \u201ctarget\u201d and \u201cdeploy\u201d with a dry-run option and adds experimental OCI content storage. Bug fixes enhance drift detection, cluster status reporting, and various operational aspects, while automation improvements bolster testing, CI, and the release workflow.'),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Populate bundle status from bundleDeployment status resources by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2359733673","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2535","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2535/hovercard",href:"https://github.com/rancher/fleet/pull/2535"},"#2535")),(0,l.yg)("li",null,"Add strict TLS mode support by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2346800281","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2507","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2507/hovercard",href:"https://github.com/rancher/fleet/pull/2507"},"#2507")),(0,l.yg)("li",null,"Adding NodeSelection for Controller Shards by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2345997673","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2505","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2505/hovercard",href:"https://github.com/rancher/fleet/pull/2505"},"#2505")),(0,l.yg)("li",null,"Extend strict TLS mode to ",(0,l.yg)("code",null,"fleet-agent")," container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2375511059","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2556","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2556/hovercard",href:"https://github.com/rancher/fleet/pull/2556"},"#2556")),(0,l.yg)("li",null,"Gitcloner recurses submodules by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2375658491","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2557","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2557/hovercard",href:"https://github.com/rancher/fleet/pull/2557"},"#2557")),(0,l.yg)("li",null,"Bundle content storage in OCI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2377863655","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2561","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2561/hovercard",href:"https://github.com/rancher/fleet/pull/2561"},"#2561")),(0,l.yg)("li",null,"Add metrics to gitops controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2357506168","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2530","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2530/hovercard",href:"https://github.com/rancher/fleet/pull/2530"},"#2530")),(0,l.yg)("li",null,"Use bundleDeployment to store resources in gitRepo status by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353413909","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2523","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2523/hovercard",href:"https://github.com/rancher/fleet/pull/2523"},"#2523")),(0,l.yg)("li",null,"Adds extraEnv to gitjob and fleet-controller deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2339834946","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2493","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2493/hovercard",href:"https://github.com/rancher/fleet/pull/2493"},"#2493")),(0,l.yg)("li",null,'Deprecate "fleet test" command, previously used to debug chart by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109938878","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2113","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2113/hovercard",href:"https://github.com/rancher/fleet/pull/2113"},"#2113")),(0,l.yg)("li",null,"Support for Azure DevOps Webhook for gitRepos using SSH URL by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2302912587","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2440","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2440/hovercard",href:"https://github.com/rancher/fleet/pull/2440"},"#2440")),(0,l.yg)("li",null,"Keep CRDs when deleting a Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2048225166","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2028","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2028/hovercard",href:"https://github.com/rancher/fleet/pull/2028"},"#2028")),(0,l.yg)("li",null,"Add correctDrift to targetCustomization by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2042071087","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2014","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2014/hovercard",href:"https://github.com/rancher/fleet/pull/2014"},"#2014")),(0,l.yg)("li",null,"Add target/deploy/dry-run CLI commands by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2102603594","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2102","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2102/hovercard",href:"https://github.com/rancher/fleet/pull/2102"},"#2102")),(0,l.yg)("li",null,"Adds option to disable polling for Git repos by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2186660640","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2226","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2226/hovercard",href:"https://github.com/rancher/fleet/pull/2226"},"#2226")),(0,l.yg)("li",null,"Only create Content resource if Bundle matches any target by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2194894549","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2239","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2239/hovercard",href:"https://github.com/rancher/fleet/pull/2239"},"#2239")),(0,l.yg)("li",null,"Removes cluster node status reporting from agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2161135650","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2190","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2190/hovercard",href:"https://github.com/rancher/fleet/pull/2190"},"#2190")),(0,l.yg)("li",null,"Merge controller and gitjob images by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2192725776","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2236","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2236/hovercard",href:"https://github.com/rancher/fleet/pull/2236"},"#2236")),(0,l.yg)("li",null,"Add static sharding support by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2237854834","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2323","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2323/hovercard",href:"https://github.com/rancher/fleet/pull/2323"},"#2323")),(0,l.yg)("li",null,"Add Prometheus Metrics by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2149350063","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2172","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2172/hovercard",href:"https://github.com/rancher/fleet/pull/2172"},"#2172")),(0,l.yg)("li",null,"Merge binaries by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2258819339","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2361","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2361/hovercard",href:"https://github.com/rancher/fleet/pull/2361"},"#2361")),(0,l.yg)("li",null,"Configurable leader election via chart values by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2019010044","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1981","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1981/hovercard",href:"https://github.com/rancher/fleet/pull/1981"},"#1981")),(0,l.yg)("li",null,"Replace ImageScan and Bundle Labels With fleet.yaml Labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2258766508","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2360","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2360/hovercard",href:"https://github.com/rancher/fleet/pull/2360"},"#2360")),(0,l.yg)("li",null,"Reduce logging for bundles from cleanup controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2270843205","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2393","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2393/hovercard",href:"https://github.com/rancher/fleet/pull/2393"},"#2393")),(0,l.yg)("li",null,"Delete namespace when a gitRepo is deleted by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2263938587","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2373","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2373/hovercard",href:"https://github.com/rancher/fleet/pull/2373"},"#2373")),(0,l.yg)("li",null,"Add readOnlyRootFilesystem to deployment_gitjob.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2266039980","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2379","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2379/hovercard",href:"https://github.com/rancher/fleet/pull/2379"},"#2379")),(0,l.yg)("li",null,"Creation of a New Webhook endpoint for Github test Webhook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2271194744","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2395","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2395/hovercard",href:"https://github.com/rancher/fleet/pull/2395"},"#2395")),(0,l.yg)("li",null,"Add a Parameter to Configure Worker count for fleet-controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2295399357","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2430","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2430/hovercard",href:"https://github.com/rancher/fleet/pull/2430"},"#2430"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Ignore status fields during drift detection by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353297690","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2522","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2522/hovercard",href:"https://github.com/rancher/fleet/pull/2522"},"#2522")),(0,l.yg)("li",null,"Fixes error display and improves user experience in git poller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2364796802","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2542","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2542/hovercard",href:"https://github.com/rancher/fleet/pull/2542"},"#2542")),(0,l.yg)("li",null,"Honor Helm's MaxHistory when using drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353133742","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2519","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2519/hovercard",href:"https://github.com/rancher/fleet/pull/2519"},"#2519")),(0,l.yg)("li",null,"Remove trailing comma from bootstrap template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Danil-Grigorev/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Danil-Grigorev"},"@Danil-Grigorev")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2310946848","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2452","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2452/hovercard",href:"https://github.com/rancher/fleet/pull/2452"},"#2452")),(0,l.yg)("li",null,"Do not count deleted bundledeployments in cluster status by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2311041603","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2454","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2454/hovercard",href:"https://github.com/rancher/fleet/pull/2454"},"#2454")),(0,l.yg)("li",null,"Fixes infinite job generation after ForceSyncGeneration changed by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2328068352","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2477","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2477/hovercard",href:"https://github.com/rancher/fleet/pull/2477"},"#2477")),(0,l.yg)("li",null,"GitRepo Initial Checkout when DisablePolling is True by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2323168608","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2469","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2469/hovercard",href:"https://github.com/rancher/fleet/pull/2469"},"#2469")),(0,l.yg)("li",null,"Filter namespaces by the kubernetes.io/metadata.name label by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2037858779","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2009","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2009/hovercard",href:"https://github.com/rancher/fleet/pull/2009"},"#2009")),(0,l.yg)("li",null,"Catch OCI version errors and return them by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2233104104","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2311","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2311/hovercard",href:"https://github.com/rancher/fleet/pull/2311"},"#2311")),(0,l.yg)("li",null,"Make AlphabeticalPolicy string check case insensitive by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aditditto/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aditditto"},"@aditditto")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2177749060","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2216","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2216/hovercard",href:"https://github.com/rancher/fleet/pull/2216"},"#2216")),(0,l.yg)("li",null,"Ignore not-found errors when deleting bundle deployments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2243969846","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2329","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2329/hovercard",href:"https://github.com/rancher/fleet/pull/2329"},"#2329")),(0,l.yg)("li",null,"Bump helm fork to 3.14.4 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2248481670","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2337","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2337/hovercard",href:"https://github.com/rancher/fleet/pull/2337"},"#2337")),(0,l.yg)("li",null,"Add missing serviceName in fleet-agent statefulset by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2066967037","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2045","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2045/hovercard",href:"https://github.com/rancher/fleet/pull/2045"},"#2045")),(0,l.yg)("li",null,"Fix gitjob log messages for controller and webhook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2261711418","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2367","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2367/hovercard",href:"https://github.com/rancher/fleet/pull/2367"},"#2367")),(0,l.yg)("li",null,"Fix helm deployer ignoring kubeconfig CLI arg by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109931596","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2112","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2112/hovercard",href:"https://github.com/rancher/fleet/pull/2112"},"#2112")),(0,l.yg)("li",null,"Return commit for revision instead of HEAD by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2280236862","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2410","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2410/hovercard",href:"https://github.com/rancher/fleet/pull/2410"},"#2410")),(0,l.yg)("li",null,"Merges gitrepo and gitops controllers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2361700242","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2537","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2537/hovercard",href:"https://github.com/rancher/fleet/pull/2537"},"#2537")),(0,l.yg)("li",null,"Partially replace cleanup with finalizers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2295817557","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2431","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2431/hovercard",href:"https://github.com/rancher/fleet/pull/2431"},"#2431")),(0,l.yg)("li",null,"Moves functionality from gitrepo to gitjob controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2327173645","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2475","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2475/hovercard",href:"https://github.com/rancher/fleet/pull/2475"},"#2475"))),(0,l.yg)("h2",null,"Redesign"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Convert fleet-agent to controller-runtime by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1890835443","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1772","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1772/hovercard",href:"https://github.com/rancher/fleet/pull/1772"},"#1772")),(0,l.yg)("li",null,"Convert fleetcontroller to controller-runtime by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2044137960","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2018","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2018/hovercard",href:"https://github.com/rancher/fleet/pull/2018"},"#2018")),(0,l.yg)("li",null,"Move ",(0,l.yg)("code",null,"rancher/gitjob")," logic to this repository by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2095804246","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2098","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2098/hovercard",href:"https://github.com/rancher/fleet/pull/2098"},"#2098")),(0,l.yg)("li",null,"Split fleet-agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1963911966","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1905","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1905/hovercard",href:"https://github.com/rancher/fleet/pull/1905"},"#1905")),(0,l.yg)("li",null,"Switch container images to busybox and suse/git by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1995107905","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1940","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1940/hovercard",href:"https://github.com/rancher/fleet/pull/1940"},"#1940")),(0,l.yg)("li",null,"Remove ",(0,l.yg)("code",null,"GitJob")," resource by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2122902006","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2129","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2129/hovercard",href:"https://github.com/rancher/fleet/pull/2129"},"#2129")),(0,l.yg)("li",null,"Clustergroup controller migration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2275478825","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2400","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2400/hovercard",href:"https://github.com/rancher/fleet/pull/2400"},"#2400"))),(0,l.yg)("h2",null,"Performance"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Reduce the number of times that Bundle resources are serialized by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2005837884","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1952","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1952/hovercard",href:"https://github.com/rancher/fleet/pull/1952"},"#1952")),(0,l.yg)("li",null,"Replace json-based implementation of DeepCopy on GenericMap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1968315954","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1915","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1915/hovercard",href:"https://github.com/rancher/fleet/pull/1915"},"#1915"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("details",null,(0,l.yg)("ul",null,(0,l.yg)("li",null,"Keep schemebuilder type by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2353647765","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2524","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2524/hovercard",href:"https://github.com/rancher/fleet/pull/2524"},"#2524")),(0,l.yg)("li",null,"Rename sharding labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2318944636","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2463","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2463/hovercard",href:"https://github.com/rancher/fleet/pull/2463"},"#2463")),(0,l.yg)("li",null,"Fix ",(0,l.yg)("code",null,"fleet apply")," command description by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2323057075","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2467","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2467/hovercard",href:"https://github.com/rancher/fleet/pull/2467"},"#2467")),(0,l.yg)("li",null,"Fix example values.yaml for enabling OCI storage by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/bigkevmcd/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/bigkevmcd"},"@bigkevmcd")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2340004325","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2494","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2494/hovercard",href:"https://github.com/rancher/fleet/pull/2494"},"#2494")),(0,l.yg)("li",null,"Refactor Gitops Controllers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2337990026","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2490","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2490/hovercard",href:"https://github.com/rancher/fleet/pull/2490"},"#2490")),(0,l.yg)("li",null,"Add authorize and defaults to gitjob controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2338496650","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2491","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2491/hovercard",href:"https://github.com/rancher/fleet/pull/2491"},"#2491")),(0,l.yg)("li",null,"Security context needs to be on container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2346033378","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2506","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2506/hovercard",href:"https://github.com/rancher/fleet/pull/2506"},"#2506")),(0,l.yg)("li",null,"Adds DeleteFunc to bundle's predicate in gitrepo's controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2348301743","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2508","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2508/hovercard",href:"https://github.com/rancher/fleet/pull/2508"},"#2508")),(0,l.yg)("li",null,"Add SecurityContext to job container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1941789294","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1860","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1860/hovercard",href:"https://github.com/rancher/fleet/pull/1860"},"#1860")),(0,l.yg)("li",null,'Revert "Add SecurityContext to job container" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1945542519","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1872","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1872/hovercard",href:"https://github.com/rancher/fleet/pull/1872"},"#1872")),(0,l.yg)("li",null,"Add SecurityContext to job container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1946998946","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1875","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1875/hovercard",href:"https://github.com/rancher/fleet/pull/1875"},"#1875")),(0,l.yg)("li",null,"Add security context to token cleanup job by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/puffitos/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/puffitos"},"@puffitos")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1944032796","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1862","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1862/hovercard",href:"https://github.com/rancher/fleet/pull/1862"},"#1862")),(0,l.yg)("li",null,"Drop wrangler-cli dependency by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1956784131","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1896","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1896/hovercard",href:"https://github.com/rancher/fleet/pull/1896"},"#1896")),(0,l.yg)("li",null,"Small refactor of debug flags handling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1957497508","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1899","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1899/hovercard",href:"https://github.com/rancher/fleet/pull/1899"},"#1899")),(0,l.yg)("li",null,"Move cleanup to a different container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1954439986","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1885","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1885/hovercard",href:"https://github.com/rancher/fleet/pull/1885"},"#1885")),(0,l.yg)("li",null,"Fix typo in README.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/guitarmanvt/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/guitarmanvt"},"@guitarmanvt")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1964022349","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1907","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1907/hovercard",href:"https://github.com/rancher/fleet/pull/1907"},"#1907")),(0,l.yg)("li",null,"Replace wrangler for kubebuilder for generating CRDs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1963848717","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1904","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1904/hovercard",href:"https://github.com/rancher/fleet/pull/1904"},"#1904")),(0,l.yg)("li",null,"Remove leftovers from controller-gen migration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1970291711","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1920","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1920/hovercard",href:"https://github.com/rancher/fleet/pull/1920"},"#1920")),(0,l.yg)("li",null,"Fix debug flag in agent commands by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1974427291","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1924","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1924/hovercard",href:"https://github.com/rancher/fleet/pull/1924"},"#1924")),(0,l.yg)("li",null,"Move agent management to a separate container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1965739264","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1910","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1910/hovercard",href:"https://github.com/rancher/fleet/pull/1910"},"#1910")),(0,l.yg)("li",null,"Improve pull request template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1996262122","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1941","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1941/hovercard",href:"https://github.com/rancher/fleet/pull/1941"},"#1941")),(0,l.yg)("li",null,"Add docs link by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2002340456","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1951","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1951/hovercard",href:"https://github.com/rancher/fleet/pull/1951"},"#1951")),(0,l.yg)("li",null,"Change variables to constants in bundle type by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2020563266","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1986","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1986/hovercard",href:"https://github.com/rancher/fleet/pull/1986"},"#1986")),(0,l.yg)("li",null,"Agent Bundle/Release Cleanup Ignores Non-Fleet Releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2014984111","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1976","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1976/hovercard",href:"https://github.com/rancher/fleet/pull/1976"},"#1976")),(0,l.yg)("li",null,"Move agentmanagement modules into its folder by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2052187498","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2032","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2032/hovercard",href:"https://github.com/rancher/fleet/pull/2032"},"#2032")),(0,l.yg)("li",null,"Improve container security by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2065607849","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2042","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2042/hovercard",href:"https://github.com/rancher/fleet/pull/2042"},"#2042")),(0,l.yg)("li",null,"Remove bd requeue, rely on drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2020559622","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1985","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1985/hovercard",href:"https://github.com/rancher/fleet/pull/1985"},"#1985")),(0,l.yg)("li",null,"Remove k8s replace from go.mod by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2086110636","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2086","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2086/hovercard",href:"https://github.com/rancher/fleet/pull/2086"},"#2086")),(0,l.yg)("li",null,"Use apimachinery yaml package directly by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2098324130","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2099","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2099/hovercard",href:"https://github.com/rancher/fleet/pull/2099"},"#2099")),(0,l.yg)("li",null,"Extract apply to applied by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2094168503","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2097","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2097/hovercard",href:"https://github.com/rancher/fleet/pull/2097"},"#2097")),(0,l.yg)("li",null,"Refactor targeting/bundle controller by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109926921","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2111","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2111/hovercard",href:"https://github.com/rancher/fleet/pull/2111"},"#2111")),(0,l.yg)("li",null,"Use git-core pkg instead of git by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2107459241","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2105","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2105/hovercard",href:"https://github.com/rancher/fleet/pull/2105"},"#2105")),(0,l.yg)("li",null,"Update helm fork, rename ForceAdopt/Adopt to TakeOwnership by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2132126024","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2146","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2146/hovercard",href:"https://github.com/rancher/fleet/pull/2146"},"#2146")),(0,l.yg)("li",null,"Move ",(0,l.yg)("code",null,"gitjob")," binary to ",(0,l.yg)("code",null,"internal/cmd")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2132258848","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2148","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2148/hovercard",href:"https://github.com/rancher/fleet/pull/2148"},"#2148")),(0,l.yg)("li",null,"Cleanup unused durations constants by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/jhoblitt/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/jhoblitt"},"@jhoblitt")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2226398605","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2286","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2286/hovercard",href:"https://github.com/rancher/fleet/pull/2286"},"#2286")),(0,l.yg)("li",null,"Propagate bundle and bundledeployment status updates to GitRepo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2179603905","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2223","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2223/hovercard",href:"https://github.com/rancher/fleet/pull/2223"},"#2223")),(0,l.yg)("li",null,"Remove Windows agent image and docs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2192743853","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2237","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2237/hovercard",href:"https://github.com/rancher/fleet/pull/2237"},"#2237")),(0,l.yg)("li",null,"Remove manifest templates by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2191857570","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2233","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2233/hovercard",href:"https://github.com/rancher/fleet/pull/2233"},"#2233")),(0,l.yg)("li",null,"Switch fetchNamespace to Get instead of list by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2166745312","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2205","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2205/hovercard",href:"https://github.com/rancher/fleet/pull/2205"},"#2205")),(0,l.yg)("li",null,"Switch fleet repo branch to main by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2195475786","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2240","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2240/hovercard",href:"https://github.com/rancher/fleet/pull/2240"},"#2240")),(0,l.yg)("li",null,"Use portable API for bind mounts in integration tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188779861","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2229","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2229/hovercard",href:"https://github.com/rancher/fleet/pull/2229"},"#2229")),(0,l.yg)("li",null,"Controller image only install ssh clients by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2248079706","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2335","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2335/hovercard",href:"https://github.com/rancher/fleet/pull/2335"},"#2335")),(0,l.yg)("li",null,"Remove unused update status code from bundle reconciler by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2256160466","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2349","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2349/hovercard",href:"https://github.com/rancher/fleet/pull/2349"},"#2349")),(0,l.yg)("li",null,"Simplify shards configuration detection by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2258162224","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2354","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2354/hovercard",href:"https://github.com/rancher/fleet/pull/2354"},"#2354")),(0,l.yg)("li",null,"Switch to tini by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2248463028","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2336","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2336/hovercard",href:"https://github.com/rancher/fleet/pull/2336"},"#2336")),(0,l.yg)("li",null,"Hide global CLI flags on sub commands by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2265439033","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2376","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2376/hovercard",href:"https://github.com/rancher/fleet/pull/2376"},"#2376")),(0,l.yg)("li",null,"CLI deploy prints to stdout by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2311000996","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2453","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2453/hovercard",href:"https://github.com/rancher/fleet/pull/2453"},"#2453")),(0,l.yg)("li",null,"metrics: optimize collection calls in reconciliation loops by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2277897649","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2406","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2406/hovercard",href:"https://github.com/rancher/fleet/pull/2406"},"#2406")),(0,l.yg)("li",null,"Refactoring CreateJob and UpdateStatus methos in Gitjob Reconciler by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/Tommy12789/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/Tommy12789"},"@Tommy12789")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2299764247","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2434","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2434/hovercard",href:"https://github.com/rancher/fleet/pull/2434"},"#2434")),(0,l.yg)("li",null,"Gitjob controller updates GitRepo with generation it is reconciling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2310909354","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2451","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2451/hovercard",href:"https://github.com/rancher/fleet/pull/2451"},"#2451")))),(0,l.yg)("h2",null,"CI / Automation"),(0,l.yg)("details",null,(0,l.yg)("ul",null,(0,l.yg)("li",null,"Improve release api description and default by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2366117641","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2548","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2548/hovercard",href:"https://github.com/rancher/fleet/pull/2548"},"#2548")),(0,l.yg)("li",null,"Fix flaky e2e tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2362518175","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2539","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2539/hovercard",href:"https://github.com/rancher/fleet/pull/2539"},"#2539")),(0,l.yg)("li",null,"dev: Make setup-single-cluster capable of setting up multiple clusters by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2318907617","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2461","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2461/hovercard",href:"https://github.com/rancher/fleet/pull/2461"},"#2461")),(0,l.yg)("li",null,"Remove linter from release pipeline by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2378303360","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2562","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2562/hovercard",href:"https://github.com/rancher/fleet/pull/2562"},"#2562")),(0,l.yg)("li",null,"Fix flaky GitRepo status tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2359587594","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2534","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2534/hovercard",href:"https://github.com/rancher/fleet/pull/2534"},"#2534")),(0,l.yg)("li",null,"Include drift end-to-end tests in CI workflows by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2357560687","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2531","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2531/hovercard",href:"https://github.com/rancher/fleet/pull/2531"},"#2531")),(0,l.yg)("li",null,"Ignore typos in embedded file by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2356696655","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2528","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2528/hovercard",href:"https://github.com/rancher/fleet/pull/2528"},"#2528")),(0,l.yg)("li",null,"Switch from omg.howdoi.website to sslip.io by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2321037884","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2466","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2466/hovercard",href:"https://github.com/rancher/fleet/pull/2466"},"#2466")),(0,l.yg)("li",null,"Fix summary and details tags in bug report template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/sbulage/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/sbulage"},"@sbulage")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2327315302","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2476","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2476/hovercard",href:"https://github.com/rancher/fleet/pull/2476"},"#2476")),(0,l.yg)("li",null,"Increase timeout and waiting for testcontainers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2343689650","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2502","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2502/hovercard",href:"https://github.com/rancher/fleet/pull/2502"},"#2502")),(0,l.yg)("li",null,"Add status reconcile tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2283773180","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2416","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2416/hovercard",href:"https://github.com/rancher/fleet/pull/2416"},"#2416")),(0,l.yg)("li",null,"Fix flaky agent modified status test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2345749832","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2504","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2504/hovercard",href:"https://github.com/rancher/fleet/pull/2504"},"#2504")),(0,l.yg)("li",null,"E2e test to checks status fields by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rubhanazeem/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rubhanazeem"},"@rubhanazeem")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2343861917","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2503","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2503/hovercard",href:"https://github.com/rancher/fleet/pull/2503"},"#2503")),(0,l.yg)("li",null,"Fixes flaky agent integration test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2348538604","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2509","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2509/hovercard",href:"https://github.com/rancher/fleet/pull/2509"},"#2509")),(0,l.yg)("li",null,"Use the same linter version in GoReleaser as for prs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2349162426","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2511","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2511/hovercard",href:"https://github.com/rancher/fleet/pull/2511"},"#2511")),(0,l.yg)("li",null,"Fix flaky integration test for git job with polling disabled by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2350332081","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2514","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2514/hovercard",href:"https://github.com/rancher/fleet/pull/2514"},"#2514")),(0,l.yg)("li",null,"Add tmate debugging info to Nightly E2E workflow by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1932553904","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1847","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1847/hovercard",href:"https://github.com/rancher/fleet/pull/1847"},"#1847")),(0,l.yg)("li",null,"Reduce replica count in rancher integration tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1929852102","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1840","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1840/hovercard",href:"https://github.com/rancher/fleet/pull/1840"},"#1840")),(0,l.yg)("li",null,"Remove cache action for Go build artifacts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1945000917","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1867","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1867/hovercard",href:"https://github.com/rancher/fleet/pull/1867"},"#1867")),(0,l.yg)("li",null,"Prevent debug images from creating GitHub releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1946780667","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1873","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1873/hovercard",href:"https://github.com/rancher/fleet/pull/1873"},"#1873")),(0,l.yg)("li",null,"Use configmap example for ",(0,l.yg)("code",null,"keepResources")," E2E tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1945350043","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1870","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1870/hovercard",href:"https://github.com/rancher/fleet/pull/1870"},"#1870")),(0,l.yg)("li",null,"Clean up e2e test resources by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1947082629","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1876","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1876/hovercard",href:"https://github.com/rancher/fleet/pull/1876"},"#1876")),(0,l.yg)("li",null,"Update exact Fleet version when releasing against Rancher by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1952352330","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1880","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1880/hovercard",href:"https://github.com/rancher/fleet/pull/1880"},"#1880")),(0,l.yg)("li",null,"Use private configmap chart for OCI testing by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1957212101","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1898","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1898/hovercard",href:"https://github.com/rancher/fleet/pull/1898"},"#1898")),(0,l.yg)("li",null,"Lower debug level in dev scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1963638015","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1903","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1903/hovercard",href:"https://github.com/rancher/fleet/pull/1903"},"#1903")),(0,l.yg)("li",null,"Fix flaky smoke test for cluster registration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1968035872","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1913","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1913/hovercard",href:"https://github.com/rancher/fleet/pull/1913"},"#1913")),(0,l.yg)("li",null,"Add acceptance tests to AKS and GKE CI workflows by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1968151102","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1914","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1914/hovercard",href:"https://github.com/rancher/fleet/pull/1914"},"#1914")),(0,l.yg)("li",null,"Make sure that all go.mods are tidy for new prs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1996298811","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1942","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1942/hovercard",href:"https://github.com/rancher/fleet/pull/1942"},"#1942")),(0,l.yg)("li",null,"Provide release.yaml charts version as array by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2012438999","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1971","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1971/hovercard",href:"https://github.com/rancher/fleet/pull/1971"},"#1971")),(0,l.yg)("li",null,"Switch bundle diff test to use random target namespaces by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2014372575","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1975","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1975/hovercard",href:"https://github.com/rancher/fleet/pull/1975"},"#1975")),(0,l.yg)("li",null,"Switch upgrade test to fleet-test-data repo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1992431831","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1936","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1936/hovercard",href:"https://github.com/rancher/fleet/pull/1936"},"#1936")),(0,l.yg)("li",null,"Remove s390x as runners are not available by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2024100159","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1995","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1995/hovercard",href:"https://github.com/rancher/fleet/pull/1995"},"#1995")),(0,l.yg)("li",null,"Add config for user/passwords in test infra by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2020905725","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1987","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1987/hovercard",href:"https://github.com/rancher/fleet/pull/1987"},"#1987")),(0,l.yg)("li",null,"Fix flaky gitrepo test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2030522456","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1999","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1999/hovercard",href:"https://github.com/rancher/fleet/pull/1999"},"#1999")),(0,l.yg)("li",null,"Add workflow for porting issues by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2041648810","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2012","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2012/hovercard",href:"https://github.com/rancher/fleet/pull/2012"},"#2012")),(0,l.yg)("li",null,"Use a different secret for GITHUB_TOKEN by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2043557441","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2016","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2016/hovercard",href:"https://github.com/rancher/fleet/pull/2016"},"#2016")),(0,l.yg)("li",null,"Adapt release script to build.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2043259249","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2015","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2015/hovercard",href:"https://github.com/rancher/fleet/pull/2015"},"#2015")),(0,l.yg)("li",null,"Add initial gitrepo controller integration test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2052784725","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2034","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2034/hovercard",href:"https://github.com/rancher/fleet/pull/2034"},"#2034")),(0,l.yg)("li",null,"Update CI up to k8s 1.29 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2081820873","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2073","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2073/hovercard",href:"https://github.com/rancher/fleet/pull/2073"},"#2073")),(0,l.yg)("li",null,"Disable cache in golangci-lint action by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2082403965","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2075","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2075/hovercard",href:"https://github.com/rancher/fleet/pull/2075"},"#2075")),(0,l.yg)("li",null,"Release scripts chart dir var by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2084413168","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2081","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2081/hovercard",href:"https://github.com/rancher/fleet/pull/2081"},"#2081")),(0,l.yg)("li",null,"Remove remaining s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2083721520","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2078","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2078/hovercard",href:"https://github.com/rancher/fleet/pull/2078"},"#2078")),(0,l.yg)("li",null,"Remove nightly image build by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2118784304","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2122","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2122/hovercard",href:"https://github.com/rancher/fleet/pull/2122"},"#2122")),(0,l.yg)("li",null,"Infra e2e command uses a published fleet module by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2127319651","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2137","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2137/hovercard",href:"https://github.com/rancher/fleet/pull/2137"},"#2137")),(0,l.yg)("li",null,"Add dev docs for changing the infra command by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2132221945","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2147","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2147/hovercard",href:"https://github.com/rancher/fleet/pull/2147"},"#2147")),(0,l.yg)("li",null,"Add gitjob end-to-end tests with SSH key by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2109627478","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2109","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2109/hovercard",href:"https://github.com/rancher/fleet/pull/2109"},"#2109")),(0,l.yg)("li",null,"Add CI workflow releasing Fleet charts against a test repo by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2227864431","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2296","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2296/hovercard",href:"https://github.com/rancher/fleet/pull/2296"},"#2296")),(0,l.yg)("li",null,"Add initial Renovate configuration by @renovate-rancher in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2224521380","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2274","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2274/hovercard",href:"https://github.com/rancher/fleet/pull/2274"},"#2274")),(0,l.yg)("li",null,"CI script to update fleet reset values by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202937276","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2261","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2261/hovercard",href:"https://github.com/rancher/fleet/pull/2261"},"#2261")),(0,l.yg)("li",null,"CI: Revert typos back to master by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2222518439","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2272","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2272/hovercard",href:"https://github.com/rancher/fleet/pull/2272"},"#2272")),(0,l.yg)("li",null,"Disable FOSSA check for RC releases by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2235139699","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2316","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2316/hovercard",href:"https://github.com/rancher/fleet/pull/2316"},"#2316")),(0,l.yg)("li",null,"Upgrade Fleet in Rancher only triggered manually by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2197306694","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2241","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2241/hovercard",href:"https://github.com/rancher/fleet/pull/2241"},"#2241")),(0,l.yg)("li",null,"Remove zube label handling by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2222357941","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2270","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2270/hovercard",href:"https://github.com/rancher/fleet/pull/2270"},"#2270")),(0,l.yg)("li",null,"Replace Drone pipeline with Github actions by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2144033837","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2168","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2168/hovercard",href:"https://github.com/rancher/fleet/pull/2168"},"#2168")),(0,l.yg)("li",null,"Optimize renovate config by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2225725538","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2283","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2283/hovercard",href:"https://github.com/rancher/fleet/pull/2283"},"#2283")),(0,l.yg)("li",null,"Remove drone and dapper scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2167092697","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2207","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2207/hovercard",href:"https://github.com/rancher/fleet/pull/2207"},"#2207")),(0,l.yg)("li",null,"Do not mess up go toolchain during release by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2169305864","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2209","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2209/hovercard",href:"https://github.com/rancher/fleet/pull/2209"},"#2209")),(0,l.yg)("li",null,"Duplicate integrationtests scripts for devs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202423682","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2259","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2259/hovercard",href:"https://github.com/rancher/fleet/pull/2259"},"#2259")),(0,l.yg)("li",null,'Fix "Upgrade Fleet in Rancher To HEAD" CI by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2202794521","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2260","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2260/hovercard",href:"https://github.com/rancher/fleet/pull/2260"},"#2260")),(0,l.yg)("li",null,"Fix Helm chart version computation in release workflow by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188219748","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2227","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2227/hovercard",href:"https://github.com/rancher/fleet/pull/2227"},"#2227")),(0,l.yg)("li",null,"Improve release scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2233316374","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2312","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2312/hovercard",href:"https://github.com/rancher/fleet/pull/2312"},"#2312")),(0,l.yg)("li",null,"Fixes for image reference and CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2200504121","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2253","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2253/hovercard",href:"https://github.com/rancher/fleet/pull/2253"},"#2253")),(0,l.yg)("li",null,"Improve release scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2237274685","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2321","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2321/hovercard",href:"https://github.com/rancher/fleet/pull/2321"},"#2321")),(0,l.yg)("li",null,"Bump Fleet version used within installation documentation to 0.9.3 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2249559463","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2338","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2338/hovercard",href:"https://github.com/rancher/fleet/pull/2338"},"#2338")),(0,l.yg)("li",null,"Make pre-release detection automatic by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2246220747","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2333","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2333/hovercard",href:"https://github.com/rancher/fleet/pull/2333"},"#2333")),(0,l.yg)("li",null,"Update dev/README Dockerfile for act container image by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2240210266","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2326","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2326/hovercard",href:"https://github.com/rancher/fleet/pull/2326"},"#2326")),(0,l.yg)("li",null,"Add developer docs for monitoring by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2161042895","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2189","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2189/hovercard",href:"https://github.com/rancher/fleet/pull/2189"},"#2189")),(0,l.yg)("li",null,"Publish to docker.io/rancher (",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno"),")"),(0,l.yg)("li",null,"Clean up metrics tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2269445338","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2387","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2387/hovercard",href:"https://github.com/rancher/fleet/pull/2387"},"#2387")),(0,l.yg)("li",null,"Remove go.mod from infra test setup command by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2265685027","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2378","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2378/hovercard",href:"https://github.com/rancher/fleet/pull/2378"},"#2378")),(0,l.yg)("li",null,"Simplify sharding end-to-end tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2271468604","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2396","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2396/hovercard",href:"https://github.com/rancher/fleet/pull/2396"},"#2396")),(0,l.yg)("li",null,"Remove go work section from dev README by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2266055045","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2380","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2380/hovercard",href:"https://github.com/rancher/fleet/pull/2380"},"#2380")),(0,l.yg)("li",null,"metrics: Add E2E test for cluster deletion by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2263563973","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2371","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2371/hovercard",href:"https://github.com/rancher/fleet/pull/2371"},"#2371")),(0,l.yg)("li",null,"Ignore gosec errors in end-to-end tests infra setup by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2270828693","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2392","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2392/hovercard",href:"https://github.com/rancher/fleet/pull/2392"},"#2392")),(0,l.yg)("li",null,"Add sharding to Fleet deployments in CI workflows running end-to-end tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2277427905","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2405","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2405/hovercard",href:"https://github.com/rancher/fleet/pull/2405"},"#2405")),(0,l.yg)("li",null,"dev-scripts: Change apiServerURL for setup-fleet-downstream by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2071940986","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2052","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2052/hovercard",href:"https://github.com/rancher/fleet/pull/2052"},"#2052")),(0,l.yg)("li",null,"Improve logging and document issue running ",(0,l.yg)("code",null,"act")," in a linked git worktree by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2263578613","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2372","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2372/hovercard",href:"https://github.com/rancher/fleet/pull/2372"},"#2372")),(0,l.yg)("li",null,"metrics: make sure metrics work well with sharding by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2285477953","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2420","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2420/hovercard",href:"https://github.com/rancher/fleet/pull/2420"},"#2420")),(0,l.yg)("li",null,"Re-enable fossa by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/olblak/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/olblak"},"@olblak")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2310005735","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2446","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2446/hovercard",href:"https://github.com/rancher/fleet/pull/2446"},"#2446")))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.5...v0.10.0"},(0,l.yg)("tt",null,"v0.9.5...v0.10.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-0.10.0.tgz"},"fleet-0.10.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-crd-0.10.0.tgz"},"fleet-crd-0.10.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-agent-0.10.0.tgz"},"fleet-agent-0.10.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet_0.10.0_checksums.txt"},"fleet_0.10.0_checksums.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.10.0/fleet-linux-amd64"},"fleet-linux-amd64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.10.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/680ed9ed.922cdd36.js b/assets/js/680ed9ed.833fdd7b.js similarity index 50% rename from assets/js/680ed9ed.922cdd36.js rename to assets/js/680ed9ed.833fdd7b.js index 91036ae70..a45c1e66c 100644 --- a/assets/js/680ed9ed.922cdd36.js +++ b/assets/js/680ed9ed.833fdd7b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3390],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},g=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return n?r.createElement(m,o(o({ref:t},g),{},{components:n})):r.createElement(m,o({ref:t},g))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:a,o[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const i={},o="Manager Initiated",c={unversionedId:"manager-initiated",id:"version-0.4/manager-initiated",title:"Manager Initiated",description:"Refer to the overview page for a background information on the manager initiated registration style.",source:"@site/versioned_docs/version-0.4/manager-initiated.md",sourceDirName:".",slug:"/manager-initiated",permalink:"/0.4/manager-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/manager-initiated.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Agent Initiated",permalink:"/0.4/agent-initiated"},next:{title:"Cluster Groups",permalink:"/0.4/cluster-group"}},l={},s=[{value:"Kubeconfig Secret",id:"kubeconfig-secret",level:2},{value:"Example",id:"example",level:2},{value:"Kubeconfig Secret",id:"kubeconfig-secret-1",level:3},{value:"Cluster",id:"cluster",level:3}],g={toc:s},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"manager-initiated"},"Manager Initiated"),(0,a.yg)("p",null,"Refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the manager initiated registration style."),(0,a.yg)("h2",{id:"kubeconfig-secret"},"Kubeconfig Secret"),(0,a.yg)("p",null,"The manager initiated registration flow is accomplished by creating a\n",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,a.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,a.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,a.yg)("p",null,"The format of this secret is intended to match the ",(0,a.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format"),"\nof the kubeconfig\nsecret used in ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically\nregistered with Fleet."),(0,a.yg)("h2",{id:"example"},"Example"),(0,a.yg)("h3",{id:"kubeconfig-secret-1"},"Kubeconfig Secret"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,a.yg)("h3",{id:"cluster"},"Cluster"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3390],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},g=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,g=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=a,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||i;return n?r.createElement(m,o(o({ref:t},g),{},{components:n})):r.createElement(m,o({ref:t},g))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:a,o[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const i={},o="Manager Initiated",c={unversionedId:"manager-initiated",id:"version-0.4/manager-initiated",title:"Manager Initiated",description:"Refer to the overview page for a background information on the manager initiated registration style.",source:"@site/versioned_docs/version-0.4/manager-initiated.md",sourceDirName:".",slug:"/manager-initiated",permalink:"/0.4/manager-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/manager-initiated.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Agent Initiated",permalink:"/0.4/agent-initiated"},next:{title:"Cluster Groups",permalink:"/0.4/cluster-group"}},l={},s=[{value:"Kubeconfig Secret",id:"kubeconfig-secret",level:2},{value:"Example",id:"example",level:2},{value:"Kubeconfig Secret",id:"kubeconfig-secret-1",level:3},{value:"Cluster",id:"cluster",level:3}],g={toc:s},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"manager-initiated"},"Manager Initiated"),(0,a.yg)("p",null,"Refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the manager initiated registration style."),(0,a.yg)("h2",{id:"kubeconfig-secret"},"Kubeconfig Secret"),(0,a.yg)("p",null,"The manager initiated registration flow is accomplished by creating a\n",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,a.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,a.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,a.yg)("p",null,"The format of this secret is intended to match the ",(0,a.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format"),"\nof the kubeconfig\nsecret used in ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically\nregistered with Fleet."),(0,a.yg)("h2",{id:"example"},"Example"),(0,a.yg)("h3",{id:"kubeconfig-secret-1"},"Kubeconfig Secret"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,a.yg)("h3",{id:"cluster"},"Cluster"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/69dd637e.1794c41d.js b/assets/js/69dd637e.5ffd97c8.js similarity index 69% rename from assets/js/69dd637e.1794c41d.js rename to assets/js/69dd637e.5ffd97c8.js index c371426cc..4add7f041 100644 --- a/assets/js/69dd637e.1794c41d.js +++ b/assets/js/69dd637e.5ffd97c8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5801],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||l;return n?r.createElement(d,o(o({ref:t},f),{},{components:n})):r.createElement(d,o({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.9/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.9/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.9/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.9/bundle-add"},next:{title:"fleet",permalink:"/0.9/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5801],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||l;return n?r.createElement(d,o(o({ref:t},f),{},{components:n})):r.createElement(d,o({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.9/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.9/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.9/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.9/bundle-add"},next:{title:"fleet",permalink:"/0.9/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6a840bac.23d5dcbf.js b/assets/js/6a840bac.30c51ac3.js similarity index 64% rename from assets/js/6a840bac.23d5dcbf.js rename to assets/js/6a840bac.30c51ac3.js index 3a0db3ada..902295ceb 100644 --- a/assets/js/6a840bac.23d5dcbf.js +++ b/assets/js/6a840bac.30c51ac3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6762],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function h(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=h({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},1409:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>g,frontMatter:()=>i,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),o=a(1470),u=a(9365);const i={},c="Quick Start",d={unversionedId:"quickstart",id:"version-0.6/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.6/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.6/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/quickstart.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.6/"},next:{title:"Creating a Deployment",permalink:"/0.6/tut-deployment"}},p={},m=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:m},f="wrapper";function g(e){let{components:t,...i}=e;return(0,l.yg)(f,(0,n.A)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null,"Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure\nthings to your cluster."),(0,l.yg)(o.A,{mdxType:"Tabs"},(0,l.yg)(u.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm")),(0,l.yg)(u.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.6"].fleetCRD,"\nhelm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",r.e["v0.6"].fleet),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}g.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6762],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function h(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=h({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},1409:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>g,frontMatter:()=>i,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),o=a(1470),u=a(9365);const i={},c="Quick Start",d={unversionedId:"quickstart",id:"version-0.6/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.6/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.6/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/quickstart.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.6/"},next:{title:"Creating a Deployment",permalink:"/0.6/tut-deployment"}},p={},m=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:m},f="wrapper";function g(e){let{components:t,...i}=e;return(0,l.yg)(f,(0,n.A)({},h,i,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null,"Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure\nthings to your cluster."),(0,l.yg)(o.A,{mdxType:"Tabs"},(0,l.yg)(u.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm")),(0,l.yg)(u.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.6"].fleetCRD,"\nhelm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",r.e["v0.6"].fleet),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}g.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/635f26b6.9ac74d6d.js b/assets/js/6c233221.d6fcc8ad.js similarity index 94% rename from assets/js/635f26b6.9ac74d6d.js rename to assets/js/6c233221.d6fcc8ad.js index 8cf785140..9b3ef6529 100644 --- a/assets/js/635f26b6.9ac74d6d.js +++ b/assets/js/6c233221.d6fcc8ad.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6063],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},9374:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.8/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.8/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.8/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cluster-registration.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.8/installation"},next:{title:"Create Cluster Groups",permalink:"/0.8/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.8/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/0.8/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/0.8/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.8/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3247],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},263:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.9/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.9/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.9/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cluster-registration.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.9/installation"},next:{title:"Create Cluster Groups",permalink:"/0.9/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.9/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/0.9/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/0.9/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.9/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6c233221.f74208a2.js b/assets/js/6c233221.f74208a2.js deleted file mode 100644 index 66a9c1a46..000000000 --- a/assets/js/6c233221.f74208a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3247],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},263:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.9/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.9/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.9/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cluster-registration.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.9/installation"},next:{title:"Create Cluster Groups",permalink:"/0.9/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.9/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/0.9/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/0.9/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.9/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6cbe47eb.db5bec14.js b/assets/js/6cbe47eb.9c7051ba.js similarity index 68% rename from assets/js/6cbe47eb.db5bec14.js rename to assets/js/6cbe47eb.9c7051ba.js index e29a4e4f1..833922c94 100644 --- a/assets/js/6cbe47eb.db5bec14.js +++ b/assets/js/6cbe47eb.9c7051ba.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5203],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||l;return n?r.createElement(d,o(o({ref:t},f),{},{components:n})):r.createElement(d,o({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.8/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.8/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.8/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.8/bundle-add"},next:{title:"fleet",permalink:"/0.8/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n --simulators int Numbers of simulators to run\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5203],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||l;return n?r.createElement(d,o(o({ref:t},f),{},{components:n})):r.createElement(d,o({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.8/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.8/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.8/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.8/bundle-add"},next:{title:"fleet",permalink:"/0.8/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n --simulators int Numbers of simulators to run\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f63438e5.b0f6ea87.js b/assets/js/6cf4c0df.14db90db.js similarity index 88% rename from assets/js/f63438e5.b0f6ea87.js rename to assets/js/6cf4c0df.14db90db.js index 6a560c3a0..655046f2d 100644 --- a/assets/js/f63438e5.b0f6ea87.js +++ b/assets/js/6cf4c0df.14db90db.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2089],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Webhook",l={unversionedId:"webhook",id:"version-0.4/webhook",title:"Webhook",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.4/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.4/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/webhook.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.4/bundle-diffs"},next:{title:"Image scan",permalink:"/0.4/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"webhook"},"Webhook"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9279],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Webhook",l={unversionedId:"webhook",id:"version-0.5/webhook",title:"Webhook",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.5/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.5/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/webhook.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.5/bundle-diffs"},next:{title:"Image scan",permalink:"/0.5/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"webhook"},"Webhook"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/6cf4c0df.a9767a20.js b/assets/js/6cf4c0df.a9767a20.js deleted file mode 100644 index b44a3b354..000000000 --- a/assets/js/6cf4c0df.a9767a20.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9279],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Webhook",l={unversionedId:"webhook",id:"version-0.5/webhook",title:"Webhook",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.5/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.5/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/webhook.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.5/bundle-diffs"},next:{title:"Image scan",permalink:"/0.5/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"webhook"},"Webhook"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/6df7348f.ee8ae7c6.js b/assets/js/6df7348f.5a04837e.js similarity index 51% rename from assets/js/6df7348f.ee8ae7c6.js rename to assets/js/6df7348f.5a04837e.js index c29e6cfb5..8bea04305 100644 --- a/assets/js/6df7348f.ee8ae7c6.js +++ b/assets/js/6df7348f.5a04837e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6951],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),f=s(n),p=a,d=f["".concat(c,".").concat(p)]||f[p]||g[p]||o;return n?r.createElement(d,l(l({ref:t},u),{},{components:n})):r.createElement(d,l({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=p;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet-agent"},l=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.10/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.10/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.10/bundle-add"},next:{title:"fleet-agent clusterstatus",permalink:"/0.10/cli/fleet-agent/fleet-agent_clusterstatus"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:s},f="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,a.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_clusterstatus"},"fleet-agent clusterstatus"),"\t - Continuously report resource status to the upstream cluster"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_register"},"fleet-agent register"),"\t - Register agent with an upstream cluster")))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6951],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),f=s(n),p=a,d=f["".concat(c,".").concat(p)]||f[p]||g[p]||o;return n?r.createElement(d,l(l({ref:t},u),{},{components:n})):r.createElement(d,l({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=p;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet-agent"},l=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.10/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.10/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.10/bundle-add"},next:{title:"fleet-agent clusterstatus",permalink:"/0.10/cli/fleet-agent/fleet-agent_clusterstatus"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:s},f="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,a.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_clusterstatus"},"fleet-agent clusterstatus"),"\t - Continuously report resource status to the upstream cluster"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"./fleet-agent_register"},"fleet-agent register"),"\t - Register agent with an upstream cluster")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e08701a.0eb1ec90.js b/assets/js/6e08701a.1b7a2315.js similarity index 67% rename from assets/js/6e08701a.0eb1ec90.js rename to assets/js/6e08701a.1b7a2315.js index d0c1f7d14..2bc63a6a7 100644 --- a/assets/js/6e08701a.0eb1ec90.js +++ b/assets/js/6e08701a.1b7a2315.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8175],{5680:(e,t,n)=>{n.d(t,{xA:()=>i,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),g=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},i=function(e){var t=g(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,i=c(e,["components","mdxType","originalType","parentName"]),s=g(n),y=a,m=s["".concat(p,".").concat(y)]||s[y]||u[y]||o;return n?r.createElement(m,l(l({ref:t},i),{},{components:n})):r.createElement(m,l({ref:t},i))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=y;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[s]="string"==typeof e?e:a,l[1]=c;for(var g=2;g{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>g});var r=n(8168),a=(n(6540),n(5680));const o={title:"0.9 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.9/changelogs/index",title:"0.9 Changelogs",description:"* v0.9.6 (latest)",source:"@site/versioned_docs/version-0.9/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.9/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/index.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"0.9 Changelogs"}},p={},g=[],i={toc:g},s="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(s,(0,r.A)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.6"},"v0.9.6")," (latest)")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.5"},"v0.9.5")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.4"},"v0.9.4")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.3"},"v0.9.3")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.2"},"v0.9.2")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.1"},"v0.9.1")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.0"},"v0.9.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8175],{5680:(e,t,n)=>{n.d(t,{xA:()=>i,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),g=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},i=function(e){var t=g(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,i=c(e,["components","mdxType","originalType","parentName"]),s=g(n),y=a,m=s["".concat(p,".").concat(y)]||s[y]||u[y]||o;return n?r.createElement(m,l(l({ref:t},i),{},{components:n})):r.createElement(m,l({ref:t},i))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=y;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[s]="string"==typeof e?e:a,l[1]=c;for(var g=2;g{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>g});var r=n(8168),a=(n(6540),n(5680));const o={title:"0.9 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.9/changelogs/index",title:"0.9 Changelogs",description:"* v0.9.6 (latest)",source:"@site/versioned_docs/version-0.9/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.9/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/index.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"0.9 Changelogs"}},p={},g=[],i={toc:g},s="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(s,(0,r.A)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.6"},"v0.9.6")," (latest)")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.5"},"v0.9.5")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.4"},"v0.9.4")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.3"},"v0.9.3")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.2"},"v0.9.2")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.1"},"v0.9.1")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.9/changelogs/changelogs/v0.9.0"},"v0.9.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e869bec.4b5be406.js b/assets/js/6e869bec.4b5be406.js deleted file mode 100644 index cf1fae03f..000000000 --- a/assets/js/6e869bec.4b5be406.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[67],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>y});var a=t(6540);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(t),u=l,y=d["".concat(s,".").concat(u)]||d[u]||c[u]||r;return t?a.createElement(y,i(i({ref:n},m),{},{components:t})):a.createElement(y,i({ref:n},m))}));function y(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,i=new Array(r);i[0]=u;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:l,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>o,toc:()=>p});var a=t(8168),l=(t(6540),t(5680));const r={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.9/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.9/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.9/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/gitrepo-content.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.9/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.9/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],m={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,l.yg)(d,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,l.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,l.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,l.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,l.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,l.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,l.yg)("p",null,"Multiple paths can be defined for a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,l.yg)("a",{parentName:"p",href:"/0.9/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,l.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"File"),(0,l.yg)("th",{parentName:"tr",align:null},"Location"),(0,l.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,l.yg)("a",{parentName:"td",href:"/0.9/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"}," *.yaml ")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If a ",(0,l.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,l.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")),(0,l.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,l.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,l.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,l.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,l.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,l.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,l.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,l.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,l.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,l.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,l.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,l.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,l.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,l.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,l.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")),(0,l.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,l.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,l.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,l.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,l.yg)("li",{parentName:"ul"},"Multiple ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,l.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,l.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Double asterisks (",(0,l.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,l.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,l.yg)("inlineCode",{parentName:"li"},"!"))),(0,l.yg)("h2",{id:"fleetyaml"},(0,l.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,l.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,l.yg)("a",{parentName:"p",href:"/0.9/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,l.yg)("p",null,"The available fields are documented in the ",(0,l.yg)("a",{parentName:"p",href:"/0.9/ref-fleet-yaml"},"fleet.yaml reference")),(0,l.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,l.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,l.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,l.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,l.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,l.yg)("p",null,"These examples showcase the style and format for using ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,l.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,l.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,l.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,l.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,l.yg)("p",null,"The resources can then be referenced from a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,l.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,l.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,l.yg)("p",null,"There are three approaches to matching clusters for both ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,l.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,l.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,l.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,l.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,l.yg)("p",null,"When using Kustomize or Helm the ",(0,l.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,l.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,l.yg)("p",null,"A file named ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,l.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,l.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/64b4770e.d5f03359.js b/assets/js/6e869bec.51f9442c.js similarity index 84% rename from assets/js/64b4770e.d5f03359.js rename to assets/js/6e869bec.51f9442c.js index d92d2dd93..904dae0d3 100644 --- a/assets/js/64b4770e.d5f03359.js +++ b/assets/js/6e869bec.51f9442c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2008],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>y});var a=t(6540);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(t),u=l,y=d["".concat(s,".").concat(u)]||d[u]||c[u]||r;return t?a.createElement(y,i(i({ref:n},m),{},{components:t})):a.createElement(y,i({ref:n},m))}));function y(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,i=new Array(r);i[0]=u;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:l,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>o,toc:()=>p});var a=t(8168),l=(t(6540),t(5680));const r={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.8/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.8/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.8/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/gitrepo-content.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.8/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.8/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],m={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,l.yg)(d,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,l.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,l.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,l.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,l.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,l.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,l.yg)("p",null,"Multiple paths can be defined for a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,l.yg)("a",{parentName:"p",href:"/0.8/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,l.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"File"),(0,l.yg)("th",{parentName:"tr",align:null},"Location"),(0,l.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,l.yg)("a",{parentName:"td",href:"/0.8/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"}," *.yaml ")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If a ",(0,l.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,l.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")),(0,l.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,l.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,l.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,l.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,l.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,l.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,l.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,l.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,l.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,l.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,l.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,l.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,l.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,l.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,l.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")),(0,l.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,l.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,l.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,l.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,l.yg)("li",{parentName:"ul"},"Multiple ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,l.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,l.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Double asterisks (",(0,l.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,l.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,l.yg)("inlineCode",{parentName:"li"},"!"))),(0,l.yg)("h2",{id:"fleetyaml"},(0,l.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,l.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,l.yg)("a",{parentName:"p",href:"/0.8/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,l.yg)("p",null,"The available fields are documented in the ",(0,l.yg)("a",{parentName:"p",href:"/0.8/ref-fleet-yaml"},"fleet.yaml reference")),(0,l.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,l.yg)("a",{parentName:"p",href:"/0.8/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,l.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,l.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,l.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,l.yg)("p",null,"These examples showcase the style and format for using ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,l.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,l.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,l.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,l.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,l.yg)("p",null,"The resources can then be referenced from a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,l.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,l.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,l.yg)("p",null,"There are three approaches to matching clusters for both ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,l.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,l.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,l.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,l.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,l.yg)("p",null,"When using Kustomize or Helm the ",(0,l.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,l.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,l.yg)("p",null,"A file named ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,l.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,l.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"/0.8/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[67],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>y});var a=t(6540);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(t),u=l,y=d["".concat(s,".").concat(u)]||d[u]||c[u]||r;return t?a.createElement(y,i(i({ref:n},m),{},{components:t})):a.createElement(y,i({ref:n},m))}));function y(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,i=new Array(r);i[0]=u;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:l,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>o,toc:()=>p});var a=t(8168),l=(t(6540),t(5680));const r={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.9/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.9/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.9/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/gitrepo-content.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.9/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.9/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],m={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,l.yg)(d,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,l.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,l.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,l.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,l.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,l.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,l.yg)("p",null,"Multiple paths can be defined for a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,l.yg)("a",{parentName:"p",href:"/0.9/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,l.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"File"),(0,l.yg)("th",{parentName:"tr",align:null},"Location"),(0,l.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,l.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,l.yg)("a",{parentName:"td",href:"/0.9/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"}," *.yaml ")),(0,l.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,l.yg)("td",{parentName:"tr",align:null},"If a ",(0,l.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,l.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,l.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,l.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,l.yg)("inlineCode",{parentName:"td"},"path")),(0,l.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,l.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,l.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,l.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,l.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,l.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,l.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,l.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,l.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,l.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,l.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,l.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,l.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,l.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,l.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,l.yg)("inlineCode",{parentName:"li"},"subdir")),(0,l.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,l.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,l.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,l.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,l.yg)("li",{parentName:"ul"},"Multiple ",(0,l.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,l.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,l.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,l.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"Double asterisks (",(0,l.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,l.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,l.yg)("inlineCode",{parentName:"li"},"!"))),(0,l.yg)("h2",{id:"fleetyaml"},(0,l.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,l.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,l.yg)("a",{parentName:"p",href:"/0.9/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,l.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,l.yg)("p",null,"The available fields are documented in the ",(0,l.yg)("a",{parentName:"p",href:"/0.9/ref-fleet-yaml"},"fleet.yaml reference")),(0,l.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,l.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,l.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,l.yg)("p",null,(0,l.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,l.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,l.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,l.yg)("p",null,"These examples showcase the style and format for using ",(0,l.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,l.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,l.yg)("p",null,"Example ",(0,l.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,l.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,l.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,l.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,l.yg)("p",null,"The resources can then be referenced from a ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,l.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,l.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,l.yg)("p",null,"There are three approaches to matching clusters for both ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,l.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,l.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,l.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,l.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,l.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,l.yg)("p",null,"When using Kustomize or Helm the ",(0,l.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,l.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,l.yg)("p",null,"A file named ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,l.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,l.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,l.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,l.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,l.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,l.yg)("p",null,"See ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6faa62d7.0a684579.js b/assets/js/6faa62d7.b5fdb549.js similarity index 67% rename from assets/js/6faa62d7.0a684579.js rename to assets/js/6faa62d7.b5fdb549.js index a5d7d24be..60f2402b9 100644 --- a/assets/js/6faa62d7.0a684579.js +++ b/assets/js/6faa62d7.b5fdb549.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8730],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||o;return n?r.createElement(d,l(l({ref:t},f),{},{components:n})):r.createElement(d,l({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet-agent"},l=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.6/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.6/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.6/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.6/imagescan"},next:{title:"fleet",permalink:"/0.6/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n --simulators int Numbers of simulators to run\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8730],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||o;return n?r.createElement(d,l(l({ref:t},f),{},{components:n})):r.createElement(d,l({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet-agent"},l=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.6/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.6/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.6/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.6/imagescan"},next:{title:"fleet",permalink:"/0.6/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n --simulators int Numbers of simulators to run\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6fe63dff.3a08d81c.js b/assets/js/6fe63dff.b68c9442.js similarity index 65% rename from assets/js/6fe63dff.3a08d81c.js rename to assets/js/6fe63dff.b68c9442.js index 72f7a3de2..03b66ee04 100644 --- a/assets/js/6fe63dff.3a08d81c.js +++ b/assets/js/6fe63dff.b68c9442.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8031],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),i=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=i(e.components);return r.createElement(c.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),f=i(n),p=l,d=f["".concat(c,".").concat(p)]||f[p]||g[p]||a;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,s=new Array(a);s[0]=p;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[f]="string"==typeof e?e:l,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>o,toc:()=>i});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet-agent clusterstatus"},s=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_clusterstatus",id:"cli/fleet-agent/fleet-agent_clusterstatus",title:"",description:"fleet-agent clusterstatus",source:"@site/docs/cli/fleet-agent/fleet-agent_clusterstatus.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_clusterstatus",permalink:"/cli/fleet-agent/fleet-agent_clusterstatus",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-agent/fleet-agent_clusterstatus.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent clusterstatus"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/cli/fleet-agent/"},next:{title:"fleet-agent register",permalink:"/cli/fleet-agent/fleet-agent_register"}},c={},i=[{value:"fleet-agent clusterstatus",id:"fleet-agent-clusterstatus",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:i},f="wrapper";function g(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-clusterstatus"},"fleet-agent clusterstatus"),(0,l.yg)("p",null,"Continuously report resource status to the upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent clusterstatus [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for clusterstatus\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8031],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),i=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=i(e.components);return r.createElement(c.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),f=i(n),p=l,d=f["".concat(c,".").concat(p)]||f[p]||g[p]||a;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,s=new Array(a);s[0]=p;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[f]="string"==typeof e?e:l,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>o,toc:()=>i});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet-agent clusterstatus"},s=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_clusterstatus",id:"cli/fleet-agent/fleet-agent_clusterstatus",title:"",description:"fleet-agent clusterstatus",source:"@site/docs/cli/fleet-agent/fleet-agent_clusterstatus.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_clusterstatus",permalink:"/cli/fleet-agent/fleet-agent_clusterstatus",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-agent/fleet-agent_clusterstatus.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent clusterstatus"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/cli/fleet-agent/"},next:{title:"fleet-agent register",permalink:"/cli/fleet-agent/fleet-agent_register"}},c={},i=[{value:"fleet-agent clusterstatus",id:"fleet-agent-clusterstatus",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:i},f="wrapper";function g(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-clusterstatus"},"fleet-agent clusterstatus"),(0,l.yg)("p",null,"Continuously report resource status to the upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent clusterstatus [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for clusterstatus\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/702cd497.126a0392.js b/assets/js/702cd497.126a0392.js deleted file mode 100644 index f01fe7b3f..000000000 --- a/assets/js/702cd497.126a0392.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5439],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.8/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.8/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.8/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-bundle-stages.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.8/concepts"},next:{title:"Git Repository Contents",permalink:"/0.8/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.8/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.8/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.8/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/702cd497.ca2a7877.js b/assets/js/702cd497.ca2a7877.js new file mode 100644 index 000000000..bc9f20632 --- /dev/null +++ b/assets/js/702cd497.ca2a7877.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5439],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.8/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.8/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.8/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-bundle-stages.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.8/concepts"},next:{title:"Git Repository Contents",permalink:"/0.8/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.8/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.8/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.8/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/718ca91c.21640fb5.js b/assets/js/718ca91c.21640fb5.js deleted file mode 100644 index c2edd67ba..000000000 --- a/assets/js/718ca91c.21640fb5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2194],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),g=o,y=p["".concat(l,".").concat(g)]||p[g]||d[g]||i;return r?n.createElement(y,a(a({ref:t},u),{},{components:r})):n.createElement(y,a({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:o,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(8168),o=(r(6540),r(5680));const i={},a="OCI Storage",s={unversionedId:"oci-storage",id:"oci-storage",title:"OCI Storage",description:"Summary",source:"@site/docs/oci-storage.md",sourceDirName:".",slug:"/oci-storage",permalink:"/oci-storage",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/oci-storage.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"How to enable experimental features",permalink:"/enableexperimental"}},l={},c=[{value:"Summary",id:"summary",level:2},{value:"Configuring the OCI registry",id:"configuring-the-oci-registry",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.yg)(p,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"oci-storage"},"OCI Storage"),(0,o.yg)("h2",{id:"summary"},"Summary"),(0,o.yg)("p",null,"Fleet stores by default the bundle resources in etcd twice. This is done via the k8s API and there is a size limit, depending on the etcd configuration."),(0,o.yg)("p",null,"This feature will allow users to choose an OCI registry as storage for bundle resources. The bundle resource will have an empty resource list and a reference to the OCI repository server. The bundledeployment will not point to a content resource, but to an OCI repository server instead."),(0,o.yg)("p",null,"When using this feature the bundle resources are stored once, in the configured OCI registry, and Fleet won't be tied to possible ",(0,o.yg)("inlineCode",{parentName:"p"},"etcd")," size limitations."),(0,o.yg)("p",null,"This may me interesting for users who need to store big ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles"),", and could also be seen as the first step for an ",(0,o.yg)("inlineCode",{parentName:"p"},"OCIOps")," feature in the future."),(0,o.yg)("p",null,"Once the OCI registry is enabled, Fleet will use it as the source for storing ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundle")," resources.\nWhen Fleet can't access the OCI registry, it won't fall back to default ",(0,o.yg)("inlineCode",{parentName:"p"},"etcd")," storage. Instead, it will log errors so they can be fixed."),(0,o.yg)("h2",{id:"configuring-the-oci-registry"},"Configuring the OCI registry"),(0,o.yg)("p",null,"OCI registry values should be configured as an extra section in the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," yaml."),(0,o.yg)("p",null,"There are the fields involved:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'// when ociRegistry is defined Fleet will use oci registry as storage\nociRegistry:\n // reference is the OCI registry url.\n reference: "docker.io/your-user-here"\n // secret name where the credentials for the OCI registry are.\n // expects a generic secret with username and password keys set.\n authSecretName: oci-secret\n // basicHTTP allows Fleet to uses basic http connections to communicate\n // with the registry (defaults to false)\n basicHTTP: false\n // insecureSkipTLS allows connections to the OCI registry\n // without certs (defaults to false)\n insecureSkipTLS: false\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/718ca91c.bf9cdc4c.js b/assets/js/718ca91c.bf9cdc4c.js new file mode 100644 index 000000000..0e9c020bb --- /dev/null +++ b/assets/js/718ca91c.bf9cdc4c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2194],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),g=o,y=p["".concat(l,".").concat(g)]||p[g]||d[g]||i;return r?n.createElement(y,a(a({ref:t},u),{},{components:r})):n.createElement(y,a({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:o,a[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(8168),o=(r(6540),r(5680));const i={},a="OCI Storage",s={unversionedId:"oci-storage",id:"oci-storage",title:"OCI Storage",description:"Summary",source:"@site/docs/oci-storage.md",sourceDirName:".",slug:"/oci-storage",permalink:"/oci-storage",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/oci-storage.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"How to enable experimental features",permalink:"/enableexperimental"}},l={},c=[{value:"Summary",id:"summary",level:2},{value:"Configuring the OCI registry",id:"configuring-the-oci-registry",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.yg)(p,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"oci-storage"},"OCI Storage"),(0,o.yg)("h2",{id:"summary"},"Summary"),(0,o.yg)("p",null,"Fleet stores by default the bundle resources in etcd twice. This is done via the k8s API and there is a size limit, depending on the etcd configuration."),(0,o.yg)("p",null,"This feature will allow users to choose an OCI registry as storage for bundle resources. The bundle resource will have an empty resource list and a reference to the OCI repository server. The bundledeployment will not point to a content resource, but to an OCI repository server instead."),(0,o.yg)("p",null,"When using this feature the bundle resources are stored once, in the configured OCI registry, and Fleet won't be tied to possible ",(0,o.yg)("inlineCode",{parentName:"p"},"etcd")," size limitations."),(0,o.yg)("p",null,"This may me interesting for users who need to store big ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles"),", and could also be seen as the first step for an ",(0,o.yg)("inlineCode",{parentName:"p"},"OCIOps")," feature in the future."),(0,o.yg)("p",null,"Once the OCI registry is enabled, Fleet will use it as the source for storing ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundle")," resources.\nWhen Fleet can't access the OCI registry, it won't fall back to default ",(0,o.yg)("inlineCode",{parentName:"p"},"etcd")," storage. Instead, it will log errors so they can be fixed."),(0,o.yg)("h2",{id:"configuring-the-oci-registry"},"Configuring the OCI registry"),(0,o.yg)("p",null,"OCI registry values should be configured as an extra section in the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," yaml."),(0,o.yg)("p",null,"There are the fields involved:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'// when ociRegistry is defined Fleet will use oci registry as storage\nociRegistry:\n // reference is the OCI registry url.\n reference: "docker.io/your-user-here"\n // secret name where the credentials for the OCI registry are.\n // expects a generic secret with username and password keys set.\n authSecretName: oci-secret\n // basicHTTP allows Fleet to uses basic http connections to communicate\n // with the registry (defaults to false)\n basicHTTP: false\n // insecureSkipTLS allows connections to the OCI registry\n // without certs (defaults to false)\n insecureSkipTLS: false\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7292ec22.78ba5043.js b/assets/js/7292ec22.78ba5043.js new file mode 100644 index 000000000..e6230c8fe --- /dev/null +++ b/assets/js/7292ec22.78ba5043.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2589],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.6/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.6/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.6/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cluster-bundles-state.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.6/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.6/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7292ec22.f4eadcf7.js b/assets/js/7292ec22.f4eadcf7.js deleted file mode 100644 index 68f9cf007..000000000 --- a/assets/js/7292ec22.f4eadcf7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2589],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.6/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.6/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.6/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cluster-bundles-state.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.6/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.6/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/750cf41f.ff932820.js b/assets/js/750cf41f.1386afd1.js similarity index 54% rename from assets/js/750cf41f.ff932820.js rename to assets/js/750cf41f.1386afd1.js index cce2c904e..d7a1a0445 100644 --- a/assets/js/750cf41f.ff932820.js +++ b/assets/js/750cf41f.1386afd1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[783],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},f),{},{components:r})):n.createElement(g,a({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet target"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_target",id:"cli/fleet-cli/fleet_target",title:"",description:"fleet target",source:"@site/docs/cli/fleet-cli/fleet_target.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_target",permalink:"/cli/fleet-cli/fleet_target",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_target.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet target"},sidebar:"docs",previous:{title:"fleet deploy",permalink:"/cli/fleet-cli/fleet_deploy"},next:{title:"fleet test",permalink:"/cli/fleet-cli/fleet_test"}},c={},s=[{value:"fleet target",id:"fleet-target",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-target"},"fleet target"),(0,l.yg)("p",null,"Print available targets for a bundle"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet target [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the Bundle resource yaml\n -l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML\n -h, --help help for target\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[783],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},f),{},{components:r})):n.createElement(g,a({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet target"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_target",id:"cli/fleet-cli/fleet_target",title:"",description:"fleet target",source:"@site/docs/cli/fleet-cli/fleet_target.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_target",permalink:"/cli/fleet-cli/fleet_target",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_target.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet target"},sidebar:"docs",previous:{title:"fleet deploy",permalink:"/cli/fleet-cli/fleet_deploy"},next:{title:"fleet test",permalink:"/cli/fleet-cli/fleet_test"}},c={},s=[{value:"fleet target",id:"fleet-target",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-target"},"fleet target"),(0,l.yg)("p",null,"Print available targets for a bundle"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet target [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the Bundle resource yaml\n -l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML\n -h, --help help for target\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75201aa0.4ea39a09.js b/assets/js/75201aa0.4ea39a09.js new file mode 100644 index 000000000..d7bc6cbed --- /dev/null +++ b/assets/js/75201aa0.4ea39a09.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[76],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.10/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.10/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.10/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/concepts.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.10/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.10/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.10/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.10/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.10/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75201aa0.aada6610.js b/assets/js/75201aa0.aada6610.js deleted file mode 100644 index a9a8a06e9..000000000 --- a/assets/js/75201aa0.aada6610.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[76],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.10/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.10/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.10/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/concepts.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.10/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.10/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.10/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.10/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.10/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/755aca7b.c43c05f6.js b/assets/js/755aca7b.13cf3bda.js similarity index 70% rename from assets/js/755aca7b.c43c05f6.js rename to assets/js/755aca7b.13cf3bda.js index 962521c75..5dd36fc02 100644 --- a/assets/js/755aca7b.c43c05f6.js +++ b/assets/js/755aca7b.13cf3bda.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8698],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,m=p["".concat(s,".").concat(d)]||p[d]||f[d]||i;return n?r.createElement(m,l(l({ref:t},u),{},{components:n})):r.createElement(m,l({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>f,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const i={},l="Installation",o={unversionedId:"installation",id:"version-0.5/installation",title:"Installation",description:"The installation is broken up into two different use cases: Single and",source:"@site/versioned_docs/version-0.5/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.5/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/installation.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Advanced Users",permalink:"/0.5/advanced-users"},next:{title:"Single Cluster Install",permalink:"/0.5/single-cluster-install"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"installation"},"Installation"),(0,a.yg)("p",null,"The installation is broken up into two different use cases: ",(0,a.yg)("a",{parentName:"p",href:"/0.5/single-cluster-install"},"Single")," and\n",(0,a.yg)("a",{parentName:"p",href:"/0.5/multi-cluster-install"},"Multi-Cluster")," install. The single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,a.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8698],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,m=p["".concat(s,".").concat(d)]||p[d]||f[d]||i;return n?r.createElement(m,l(l({ref:t},u),{},{components:n})):r.createElement(m,l({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>f,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const i={},l="Installation",o={unversionedId:"installation",id:"version-0.5/installation",title:"Installation",description:"The installation is broken up into two different use cases: Single and",source:"@site/versioned_docs/version-0.5/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.5/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/installation.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Advanced Users",permalink:"/0.5/advanced-users"},next:{title:"Single Cluster Install",permalink:"/0.5/single-cluster-install"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"installation"},"Installation"),(0,a.yg)("p",null,"The installation is broken up into two different use cases: ",(0,a.yg)("a",{parentName:"p",href:"/0.5/single-cluster-install"},"Single")," and\n",(0,a.yg)("a",{parentName:"p",href:"/0.5/multi-cluster-install"},"Multi-Cluster")," install. The single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,a.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75753a1b.0c1da55e.js b/assets/js/75753a1b.0c1da55e.js new file mode 100644 index 000000000..7916a233b --- /dev/null +++ b/assets/js/75753a1b.0c1da55e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8034],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>y});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(t),u=r,y=d["".concat(s,".").concat(u)]||d[u]||c[u]||l;return t?a.createElement(y,i(i({ref:n},m),{},{components:t})):a.createElement(y,i({ref:n},m))}));function y(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=u;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=t(8168),r=(t(6540),t(5680));const l={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.10/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.10/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.10/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/gitrepo-content.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.10/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.10/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:2}],m={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,r.yg)(d,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.10/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,r.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,r.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,r.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,r.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,r.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,r.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,r.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,r.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,r.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,r.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,r.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,r.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")),(0,r.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,r.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,r.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,r.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,r.yg)("li",{parentName:"ul"},"Multiple ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,r.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,r.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,r.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Double asterisks (",(0,r.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,r.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,r.yg)("inlineCode",{parentName:"li"},"!"))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.10/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,r.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.10/cluster-bundles-state"},"Cluster and Bundle state"),"."),(0,r.yg)("h2",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,r.yg)("p",null,"Nested ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo CRs")," (defining a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," that points to a repository containing one or more ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources) is supported.\nYou can use this feature to take advantage of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitOps")," in your ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources or, for example, to split complex scenarios into more than one ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource.\nWhen finding a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," in a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Fleet will simply deploy it as any other resource."),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/multi-gitrepo"},"this example"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75753a1b.353de92e.js b/assets/js/75753a1b.353de92e.js deleted file mode 100644 index 1da3fde10..000000000 --- a/assets/js/75753a1b.353de92e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8034],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>y});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),d=p(t),u=r,y=d["".concat(s,".").concat(u)]||d[u]||c[u]||l;return t?a.createElement(y,i(i({ref:n},m),{},{components:t})):a.createElement(y,i({ref:n},m))}));function y(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=u;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=t(8168),r=(t(6540),t(5680));const l={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.10/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.10/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.10/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/gitrepo-content.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.10/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.10/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:2}],m={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,r.yg)(d,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.10/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,r.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,r.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,r.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,r.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,r.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,r.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,r.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,r.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,r.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,r.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,r.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,r.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")),(0,r.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,r.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,r.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,r.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,r.yg)("li",{parentName:"ul"},"Multiple ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,r.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,r.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,r.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Double asterisks (",(0,r.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,r.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,r.yg)("inlineCode",{parentName:"li"},"!"))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.10/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,r.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.10/cluster-bundles-state"},"Cluster and Bundle state"),"."),(0,r.yg)("h2",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,r.yg)("p",null,"Nested ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo CRs")," (defining a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," that points to a repository containing one or more ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources) is supported.\nYou can use this feature to take advantage of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitOps")," in your ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources or, for example, to split complex scenarios into more than one ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource.\nWhen finding a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," in a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Fleet will simply deploy it as any other resource."),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/multi-gitrepo"},"this example"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75f6c082.72e3baec.js b/assets/js/75f6c082.c4286964.js similarity index 54% rename from assets/js/75f6c082.72e3baec.js rename to assets/js/75f6c082.c4286964.js index a69a4f78b..9428039ff 100644 --- a/assets/js/75f6c082.72e3baec.js +++ b/assets/js/75f6c082.c4286964.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5564],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.10/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.10/index.md",sourceDirName:".",slug:"/",permalink:"/0.10/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/index.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.10/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5564],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.10/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.10/index.md",sourceDirName:".",slug:"/",permalink:"/0.10/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/index.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.10/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file diff --git a/assets/js/762abe3e.5b6319ae.js b/assets/js/762abe3e.5b6319ae.js new file mode 100644 index 000000000..9803c52cb --- /dev/null +++ b/assets/js/762abe3e.5b6319ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6828],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),d=a,c=u["".concat(i,".").concat(d)]||u[d]||m[d]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/docs/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-resources.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/762abe3e.7288f686.js b/assets/js/762abe3e.7288f686.js deleted file mode 100644 index 8af522c23..000000000 --- a/assets/js/762abe3e.7288f686.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6828],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),d=a,c=u["".concat(i,".").concat(d)]||u[d]||m[d]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/docs/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-resources.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7712976a.9bb3a52a.js b/assets/js/7712976a.9bb3a52a.js new file mode 100644 index 000000000..d4f4c1403 --- /dev/null +++ b/assets/js/7712976a.9bb3a52a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4963],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.8/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/versioned_docs/version-0.8/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.8/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/webhook.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.8/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.8/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/7712976a.adb6b8c4.js b/assets/js/7712976a.adb6b8c4.js deleted file mode 100644 index 8c7b9e676..000000000 --- a/assets/js/7712976a.adb6b8c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4963],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.8/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/versioned_docs/version-0.8/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.8/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/webhook.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.8/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.8/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/778a7b8d.b38dab3f.js b/assets/js/778a7b8d.b38dab3f.js new file mode 100644 index 000000000..5f206d31d --- /dev/null +++ b/assets/js/778a7b8d.b38dab3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8523],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(a),u=l,g=d["".concat(s,".").concat(u)]||d[u]||h[u]||n;return a?r.createElement(g,o(o({ref:t},p),{},{components:a})):r.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.8.3",date:"2024-03-19 10:04:05 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.3",id:"version-0.8/changelogs/changelogs/v0.8.3",title:"v0.8.3",description:"(rancherio-gh-m) released this 2024-03-19 1005 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.3.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.3",permalink:"/0.8/changelogs/changelogs/v0.8.3",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.3.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.8.3",date:"2024-03-19 10:04:05 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.2",permalink:"/0.8/changelogs/changelogs/v0.8.2"},next:{title:"",permalink:"/0.8/changelogs/changelogs/v0.8.4"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},d="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-03-19 10:04:05 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add support for Azure DevOps Webhook for gitRepos using SSH URL by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2186666693","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/453","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/453/hovercard",href:"https://github.com/rancher/gitjob/pull/453"},"rancher/gitjob#453")),(0,l.yg)("li",null,"Bump google.golang.org/protobuf from 1.31.0 to 1.33.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188388938","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2228/hovercard",href:"https://github.com/rancher/fleet/pull/2228"},"#2228")),(0,l.yg)("li",null,"Convert TestAzureDevopsWebhookWithSSHURL to support Wrangler v1.1.1 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188388938","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2228/hovercard",href:"https://github.com/rancher/fleet/pull/2228"},"#2228"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump Gitjob to ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.8.3"},"v0.8.3")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188388938","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2228/hovercard",href:"https://github.com/rancher/fleet/pull/2228"},"#2228"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.2...v0.8.3"},(0,l.yg)("tt",null,"v0.8.2...v0.8.3"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-crd-0.8.3.tgz"},"fleet-crd-0.8.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-agent-0.8.3.tgz"},"fleet-agent-0.8.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-0.8.3.tgz"},"fleet-0.8.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.3"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/778a7b8d.d9280ad7.js b/assets/js/778a7b8d.d9280ad7.js deleted file mode 100644 index 37b05f903..000000000 --- a/assets/js/778a7b8d.d9280ad7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8523],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(a),u=l,g=d["".concat(s,".").concat(u)]||d[u]||h[u]||n;return a?r.createElement(g,o(o({ref:t},p),{},{components:a})):r.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.8.3",date:"2024-03-19 10:04:05 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.3",id:"version-0.8/changelogs/changelogs/v0.8.3",title:"v0.8.3",description:"(rancherio-gh-m) released this 2024-03-19 1005 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.3.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.3",permalink:"/0.8/changelogs/changelogs/v0.8.3",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.3.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.8.3",date:"2024-03-19 10:04:05 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.2",permalink:"/0.8/changelogs/changelogs/v0.8.2"},next:{title:"",permalink:"/0.8/changelogs/changelogs/v0.8.4"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},d="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-03-19 10:04:05 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add support for Azure DevOps Webhook for gitRepos using SSH URL by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2186666693","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/453","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/453/hovercard",href:"https://github.com/rancher/gitjob/pull/453"},"rancher/gitjob#453")),(0,l.yg)("li",null,"Bump google.golang.org/protobuf from 1.31.0 to 1.33.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188388938","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2228/hovercard",href:"https://github.com/rancher/fleet/pull/2228"},"#2228")),(0,l.yg)("li",null,"Convert TestAzureDevopsWebhookWithSSHURL to support Wrangler v1.1.1 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188388938","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2228/hovercard",href:"https://github.com/rancher/fleet/pull/2228"},"#2228"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump Gitjob to ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.8.3"},"v0.8.3")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2188388938","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2228","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2228/hovercard",href:"https://github.com/rancher/fleet/pull/2228"},"#2228"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.2...v0.8.3"},(0,l.yg)("tt",null,"v0.8.2...v0.8.3"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-crd-0.8.3.tgz"},"fleet-crd-0.8.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-agent-0.8.3.tgz"},"fleet-agent-0.8.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-0.8.3.tgz"},"fleet-0.8.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.3/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.3"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77b9c036.6e6791a4.js b/assets/js/77b9c036.6e6791a4.js deleted file mode 100644 index 3009bc52e..000000000 --- a/assets/js/77b9c036.6e6791a4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6068],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>u});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},g="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),g=c(a),h=n,u=g["".concat(s,".").concat(h)]||g[h]||d[h]||l;return a?r.createElement(u,o(o({ref:t},p),{},{components:a})):r.createElement(u,o({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[g]="string"==typeof e?e:n,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.9.5",date:"2024-06-05 07:58:14 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.5",id:"version-0.9/changelogs/changelogs/v0.9.5",title:"v0.9.5",description:"(rancherio-gh-m) released this 2024-06-05 0714 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.5.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.5",permalink:"/0.9/changelogs/changelogs/v0.9.5",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.5.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.9.5",date:"2024-06-05 07:58:14 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.4",permalink:"/0.9/changelogs/changelogs/v0.9.4"},next:{title:"v0.9.6",permalink:"/0.9/changelogs/changelogs/v0.9.6"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},g="wrapper";function d(e){let{components:t,...a}=e;return(0,n.yg)(g,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-06-05 07:58:14 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Bump gitjob to version 0.9.8 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330375730","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2478","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2478/hovercard",href:"https://github.com/rancher/fleet/pull/2478"},"#2478")),(0,n.yg)("li",null,"chore: Bump docker/docker to v23.0.11 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330380483","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2479","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2479/hovercard",href:"https://github.com/rancher/fleet/pull/2479"},"#2479"))),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.4...v0.9.5"},(0,n.yg)("tt",null,"v0.9.4...v0.9.5"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-crd-0.9.5.tgz"},"fleet-crd-0.9.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-agent-0.9.5.tgz"},"fleet-agent-0.9.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-0.9.5.tgz"},"fleet-0.9.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.5"},"here"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77b9c036.85ab0134.js b/assets/js/77b9c036.85ab0134.js new file mode 100644 index 000000000..5134e5f56 --- /dev/null +++ b/assets/js/77b9c036.85ab0134.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6068],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>u});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},g="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),g=c(a),h=n,u=g["".concat(s,".").concat(h)]||g[h]||d[h]||l;return a?r.createElement(u,o(o({ref:t},p),{},{components:a})):r.createElement(u,o({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[g]="string"==typeof e?e:n,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.9.5",date:"2024-06-05 07:58:14 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.5",id:"version-0.9/changelogs/changelogs/v0.9.5",title:"v0.9.5",description:"(rancherio-gh-m) released this 2024-06-05 0714 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.5.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.5",permalink:"/0.9/changelogs/changelogs/v0.9.5",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.5.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.9.5",date:"2024-06-05 07:58:14 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.4",permalink:"/0.9/changelogs/changelogs/v0.9.4"},next:{title:"v0.9.6",permalink:"/0.9/changelogs/changelogs/v0.9.6"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},g="wrapper";function d(e){let{components:t,...a}=e;return(0,n.yg)(g,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-06-05 07:58:14 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Bump gitjob to version 0.9.8 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330375730","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2478","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2478/hovercard",href:"https://github.com/rancher/fleet/pull/2478"},"#2478")),(0,n.yg)("li",null,"chore: Bump docker/docker to v23.0.11 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330380483","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2479","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2479/hovercard",href:"https://github.com/rancher/fleet/pull/2479"},"#2479"))),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.4...v0.9.5"},(0,n.yg)("tt",null,"v0.9.4...v0.9.5"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-crd-0.9.5.tgz"},"fleet-crd-0.9.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-agent-0.9.5.tgz"},"fleet-agent-0.9.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-0.9.5.tgz"},"fleet-0.9.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.5/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.5"},"here"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/77fc540a.b43f2288.js b/assets/js/77fc540a.308ffc94.js similarity index 68% rename from assets/js/77fc540a.b43f2288.js rename to assets/js/77fc540a.308ffc94.js index ba1f94b24..0415e4878 100644 --- a/assets/js/77fc540a.b43f2288.js +++ b/assets/js/77fc540a.308ffc94.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6094],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||l;return n?r.createElement(d,o(o({ref:t},f),{},{components:n})):r.createElement(d,o({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.7/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.7/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.7/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.7/bundle-add"},next:{title:"fleet",permalink:"/0.7/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n --simulators int Numbers of simulators to run\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6094],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>d});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(n),g=a,d=p["".concat(c,".").concat(g)]||p[g]||u[g]||l;return n?r.createElement(d,o(o({ref:t},f),{},{components:n})):r.createElement(d,o({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(8168),a=(n(6540),n(5680));const l={title:"",sidebar_label:"fleet-agent"},o=void 0,i={unversionedId:"cli/fleet-agent/fleet-agent",id:"version-0.7/cli/fleet-agent/fleet-agent",title:"",description:"fleet-agent",source:"@site/versioned_docs/version-0.7/cli/fleet-agent/fleet-agent.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/",permalink:"/0.7/cli/fleet-agent/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-agent/fleet-agent.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent"},sidebar:"docs",previous:{title:"Create a Bundle Resource",permalink:"/0.7/bundle-add"},next:{title:"fleet",permalink:"/0.7/cli/fleet-cli/fleet"}},c={},s=[{value:"fleet-agent",id:"fleet-agent",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h2",{id:"fleet-agent"},"fleet-agent"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"fleet-agent [flags]\n")),(0,a.yg)("h3",{id:"options"},"Options"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"}," --agent-scope string An identifier used to scope the agent bundleID names, typically the same as namespace\n --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet-agent\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n --simulators int Numbers of simulators to run\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a815aed.5b399829.js b/assets/js/7a815aed.5b399829.js deleted file mode 100644 index bd8dfae54..000000000 --- a/assets/js/7a815aed.5b399829.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2055],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.6/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.6/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.6/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/webhook.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.6/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.6/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/7a815aed.e21410e3.js b/assets/js/7a815aed.e21410e3.js new file mode 100644 index 000000000..cea3c6623 --- /dev/null +++ b/assets/js/7a815aed.e21410e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2055],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.6/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.6/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.6/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/webhook.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.6/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.6/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/7b64d2e8.156b6454.js b/assets/js/7b64d2e8.156b6454.js new file mode 100644 index 000000000..483c02451 --- /dev/null +++ b/assets/js/7b64d2e8.156b6454.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2963],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(n),m=r,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/docs/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/bundle-add.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/imagescan"},next:{title:"fleet-agent",permalink:"/cli/fleet-agent/"}},s={},p=[{value:"Targets",id:"targets",level:2},{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"targets"},"Targets"),(0,r.yg)("p",null,"The bundle can target multiple clusters. It uses the same ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#target-matching"},"targeting as the GitRepo"),".\nAdditional ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#supported-customizations"},"customization options")," can be specified per target:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- clusterSelector:\n matchLabels:\n env: dev\n defaultNamespace: lab-1\n helm:\n values:\n replicas: 1\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7b64d2e8.42866e66.js b/assets/js/7b64d2e8.42866e66.js deleted file mode 100644 index a5e897edf..000000000 --- a/assets/js/7b64d2e8.42866e66.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2963],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(n),m=r,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?a.createElement(g,o(o({ref:t},c),{},{components:n})):a.createElement(g,o({ref:t},c))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/docs/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/bundle-add.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/imagescan"},next:{title:"fleet-agent",permalink:"/cli/fleet-agent/"}},s={},p=[{value:"Targets",id:"targets",level:2},{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(u,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"targets"},"Targets"),(0,r.yg)("p",null,"The bundle can target multiple clusters. It uses the same ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#target-matching"},"targeting as the GitRepo"),".\nAdditional ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#supported-customizations"},"customization options")," can be specified per target:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- clusterSelector:\n matchLabels:\n env: dev\n defaultNamespace: lab-1\n helm:\n values:\n replicas: 1\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7c4790a0.1ef933ce.js b/assets/js/7c4790a0.13014248.js similarity index 67% rename from assets/js/7c4790a0.1ef933ce.js rename to assets/js/7c4790a0.13014248.js index b1c5f8f15..81477afe3 100644 --- a/assets/js/7c4790a0.1ef933ce.js +++ b/assets/js/7c4790a0.13014248.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4646],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.9/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.9/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.9/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cluster-group.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.9/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.9/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4646],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.9/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.9/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.9/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cluster-group.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.9/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.9/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7c5d32d8.3918bcd7.js b/assets/js/7c5d32d8.3918bcd7.js deleted file mode 100644 index 15e001d60..000000000 --- a/assets/js/7c5d32d8.3918bcd7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6161],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.4/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.4/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.4/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/concepts.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.4/quickstart"},next:{title:"Architecture",permalink:"/0.4/architecture"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.4/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"lifecycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.4/examples#lifecycle-of-a-fleet-bundle"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.4/examples#deploy-kubernetes-manifests-across-clusters-with-customization"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7c5d32d8.e1221967.js b/assets/js/7c5d32d8.e1221967.js new file mode 100644 index 000000000..9e6619b22 --- /dev/null +++ b/assets/js/7c5d32d8.e1221967.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6161],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.4/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.4/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.4/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/concepts.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.4/quickstart"},next:{title:"Architecture",permalink:"/0.4/architecture"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.4/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"lifecycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.4/examples#lifecycle-of-a-fleet-bundle"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.4/examples#deploy-kubernetes-manifests-across-clusters-with-customization"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7f3d36ad.2a79621b.js b/assets/js/7f3d36ad.2a79621b.js deleted file mode 100644 index e9ec8310f..000000000 --- a/assets/js/7f3d36ad.2a79621b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2833],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,g=p["".concat(l,".").concat(d)]||p[d]||h[d]||o;return n?r.createElement(g,s(s({ref:t},u),{},{components:n})):r.createElement(g,s({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Architecture",i={unversionedId:"architecture",id:"version-0.5/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.5/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.5/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/architecture.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.5/concepts"},next:{title:"Examples",permalink:"/0.5/examples"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.5/manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."))}h.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/7f3d36ad.f1edd002.js b/assets/js/7f3d36ad.f1edd002.js new file mode 100644 index 000000000..199b29e3f --- /dev/null +++ b/assets/js/7f3d36ad.f1edd002.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2833],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,g=p["".concat(l,".").concat(d)]||p[d]||h[d]||o;return n?r.createElement(g,s(s({ref:t},u),{},{components:n})):r.createElement(g,s({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Architecture",i={unversionedId:"architecture",id:"version-0.5/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.5/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.5/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/architecture.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.5/concepts"},next:{title:"Examples",permalink:"/0.5/examples"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.5/manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."))}h.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/8003b96f.9126ab3e.js b/assets/js/8003b96f.9126ab3e.js new file mode 100644 index 000000000..6c8866bd2 --- /dev/null +++ b/assets/js/8003b96f.9126ab3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6395],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.9/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.9/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.9/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/bundle-diffs.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.9/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.9/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/8003b96f.d8d831b0.js b/assets/js/8003b96f.d8d831b0.js deleted file mode 100644 index 8f28abb48..000000000 --- a/assets/js/8003b96f.d8d831b0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6395],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.9/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.9/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.9/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/bundle-diffs.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.9/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.9/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/8070e160.cf2998dd.js b/assets/js/8070e160.b13b622e.js similarity index 61% rename from assets/js/8070e160.cf2998dd.js rename to assets/js/8070e160.b13b622e.js index 758bcaa9c..aa6294b2d 100644 --- a/assets/js/8070e160.cf2998dd.js +++ b/assets/js/8070e160.b13b622e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3822],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:l}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,c.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),l=i[a].value;l!==o&&(d(t),u(l))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=f(e);return n.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},n.createElement(y,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function k(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4369:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var l=a(8168),n=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/docs/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/quickstart.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/"},next:{title:"Creating a Deployment",permalink:"/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,n.yg)(m,(0,l.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"quick-start"},"Quick Start"),(0,n.yg)("p",null,(0,n.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,n.yg)("h2",{id:"install"},"Install"),(0,n.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,n.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,n.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,n.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,n.yg)(s.A,{mdxType:"Tabs"},(0,n.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,n.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,n.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,n.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,n.yg)("p",null,"Change ",(0,n.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,n.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,n.yg)("h2",{id:"get-status"},"Get Status"),(0,n.yg)("p",null,"Get status of what fleet is doing"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,n.yg)("p",null,"You should see something like this get created in your cluster."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,n.yg)("p",null,"Enjoy and read the ",(0,n.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>l});const l=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3822],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function p(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=p(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:l}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,c.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),l=i[a].value;l!==o&&(d(t),u(l))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=f(e);return n.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},n.createElement(y,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function k(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4369:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var l=a(8168),n=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/docs/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/quickstart.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/"},next:{title:"Creating a Deployment",permalink:"/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,n.yg)(m,(0,l.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"quick-start"},"Quick Start"),(0,n.yg)("p",null,(0,n.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,n.yg)("h2",{id:"install"},"Install"),(0,n.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,n.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,n.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,n.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,n.yg)(s.A,{mdxType:"Tabs"},(0,n.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,n.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,n.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,n.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,n.yg)("p",null,"Change ",(0,n.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,n.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,n.yg)("h2",{id:"get-status"},"Get Status"),(0,n.yg)("p",null,"Get status of what fleet is doing"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,n.yg)("p",null,"You should see something like this get created in your cluster."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,n.yg)("p",null,"Enjoy and read the ",(0,n.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>l});const l=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/82782dff.ca5bf7a4.js b/assets/js/82782dff.44878f5c.js similarity index 63% rename from assets/js/82782dff.ca5bf7a4.js rename to assets/js/82782dff.44878f5c.js index 77f136d91..20385e56f 100644 --- a/assets/js/82782dff.ca5bf7a4.js +++ b/assets/js/82782dff.44878f5c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8342],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:l,o[1]=i;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.6/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.6/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.6/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-cli/fleet.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.6/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.6/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8342],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:l,o[1]=i;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.6/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.6/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.6/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-cli/fleet.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.6/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.6/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8307bb82.eb0440c2.js b/assets/js/8307bb82.eb0440c2.js new file mode 100644 index 000000000..1b616d4d8 --- /dev/null +++ b/assets/js/8307bb82.eb0440c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7161],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.6/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.6/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.6/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/architecture.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.6/uninstall"},next:{title:"Core Concepts",permalink:"/0.6/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.6/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/834808ff.001f7fac.js b/assets/js/834808ff.001f7fac.js new file mode 100644 index 000000000..2bd6e33e3 --- /dev/null +++ b/assets/js/834808ff.001f7fac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5964],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),h=a,d=u["".concat(l,".").concat(h)]||u[h]||p[h]||s;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,i=new Array(s);i[0]=h;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const s={},i="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/docs/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-registration.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Status Fields",permalink:"/ref-status-fields"},next:{title:"Configuration",permalink:"/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:3},{value:"Creating the Bootstrap Secret for the Downstream Cluster",id:"creating-the-bootstrap-secret-for-the-downstream-cluster",level:3},{value:"Creating the Fleet Agent Deployment",id:"creating-the-fleet-agent-deployment",level:3},{value:"Fleet Agent Starts Registration, Upgrades to Request Account",id:"fleet-agent-starts-registration-upgrades-to-request-account",level:3},{value:"Fleet Agent is Registered, Watches for BundleDeployments",id:"fleet-agent-is-registered-watches-for-bundledeployments",level:3},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Registration Process and Controllers",id:"registration-process-and-controllers",level:3},{value:"Secrets during Agent Deployment",id:"secrets-during-agent-deployment",level:3},{value:"Fleet Cluster Registration in Rancher",id:"fleet-cluster-registration-in-rancher",level:2},{value:"Import Cluster into Rancher",id:"import-cluster-into-rancher",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,n.A)({},g,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h3",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handled by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"The process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h3",{id:"creating-the-bootstrap-secret-for-the-downstream-cluster"},"Creating the Bootstrap Secret for the Downstream Cluster"),(0,a.yg)("p",null,"In this step a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' and an "import" service account are created based on a ',(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("p",null,"The Fleet controller creates a ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken")),"\nand waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' triggers the creation of the "import" service account, which can create\n',(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system"). The ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go"),' controller will\nenqueue itself until the "import" service account exists, because that account is needed to create the ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret."),(0,a.yg)("h3",{id:"creating-the-fleet-agent-deployment"},"Creating the Fleet Agent Deployment"),(0,a.yg)("p",null,"The Fleet controller will now create the Fleet agent deployment and the bootstrap secret on the downstream cluster."),(0,a.yg)("p",null,"The bootstrap secret contains the API server URL of the upstream cluster and is used to build a kubeconfig to access the upstream cluster. Both values are taken from the Fleet controller config configmap. That configmap is part of the helm chart."),(0,a.yg)("h3",{id:"fleet-agent-starts-registration-upgrades-to-request-account"},"Fleet Agent Starts Registration, Upgrades to Request Account"),(0,a.yg)("p",null,'The agent uses the "import" account to upgrade to a request account.'),(0,a.yg)("p",null,"Immediately the Fleet agent checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap"),' secret. If the bootstrap secret, which contains the "import" kubeconfig, is present the agent starts registering.'),(0,a.yg)("p",null,"Then agent creates the final ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret's name."),(0,a.yg)("p",null,"The Fleet controller triggers and tries to grant the ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," request to create agent's service account and create the 'c-","*","' registration secret with the client's new kubeconfig. The registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),"."),(0,a.yg)("p",null,'The new kubeconfig uses the "request" account. The "request" account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"Contents"),"."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"ClusterRegistationToken to ClusterRegistration",src:r(4294).A,width:"1241",height:"689"})),(0,a.yg)("h3",{id:"fleet-agent-is-registered-watches-for-bundledeployments"},"Fleet Agent is Registered, Watches for ",(0,a.yg)("inlineCode",{parentName:"h3"},"BundleDeployments")),(0,a.yg)("p",null,'At this point the agent is fully registered and will persist the "request" account into a ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," secret.\nThe API server URL and CA are copied from the bootstrap secret, which inherited these values from the Fleet controller's helm chart values."),(0,a.yg)("p",null,"The bootstrap secret is deleted. When the agent restarts, it will not re-register, since the bootstrap secret is missing."),(0,a.yg)("p",null,'The agent starts watching its "',(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces#cluster-namespaces"},"Cluster Namespace"),'" for ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),". At this point the agent is ready to deploy workloads."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},'The fleet-default namespace has all the cluster registrations, the "import" account uses a separate namespace.'),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster or namespace change. The ",(0,a.yg)("inlineCode",{parentName:"li"},"manageagent"),' controller will then create a bundle to adopt the existing agent deployment. The agent will update itself to the bundle and since the "generation" environment variable changes, it will restart.'),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"registration-process-and-controllers"},"Registration Process and Controllers"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster."),(0,a.yg)("p",null,"It is important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets-during-agent-deployment"},"Secrets during Agent Deployment"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," controller triggers on Cluster creation/update events and deploys the agent."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"This image shows how the API server URL and CA propagates through the secrets during registration:")),(0,a.yg)("p",null,"The arrows in the diagram show how the API server values are copied from\nthe Helm values to the cluster registration secret on the upstream\ncluster and finally downstream to the bootstrap secret of the agent."),(0,a.yg)("p",null,'There is one special case, if the agent is for the local/"bootstrap"\ncluster, the server values also exist in the kubeconfig secret,\nreferenced by the Cluster resource. In this case the kubeconfig secret\ncontains the upstream server URL and CA, next to the downstream\'s\nkubeconfig. If the settings are present in the kubeconfig secret, they\noverride the configured values.'),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})),(0,a.yg)("h2",{id:"fleet-cluster-registration-in-rancher"},"Fleet Cluster Registration in Rancher"),(0,a.yg)("p",null,"Rancher installs the fleet helm chart. The API server URL and CA are ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/release/v2.9/pkg/controllers/dashboard/fleetcharts/controller.go#L111-L112"},"derived from Rancher's settings"),"."),(0,a.yg)("p",null,"Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller."),(0,a.yg)("h3",{id:"import-cluster-into-rancher"},"Import Cluster into Rancher"),(0,a.yg)("p",null,"When the user runs ",(0,a.yg)("inlineCode",{parentName:"p"},"curl | kubectl apply"),", the applied manifest includes the rancher agent deployment."),(0,a.yg)("p",null,"The deployment contains a secret ",(0,a.yg)("inlineCode",{parentName:"p"},"cattle-credentials-")," which contains the API URL and a token."),(0,a.yg)("p",null,"The Rancher agent starts up and reports downstream's kubeconfig to upstream."),(0,a.yg)("p",null,"Rancher then creates the fleet Cluster resource, which references a ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/871b6d9137246bd93733f01184ea435f40c5d56c/pkg/provisioningv2/kubeconfig/manager.go#L69"},"kubeconfig secret"),"."),(0,a.yg)("p",null,"\ud83d\udc49Fleet will use this kubeconfig to deploy the agent on the downstream cluster."))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"},4294:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationToken-96af9ec264665fd3fef0c450747987ef.svg"}}]); \ No newline at end of file diff --git a/assets/js/834808ff.8a3d2630.js b/assets/js/834808ff.8a3d2630.js deleted file mode 100644 index 5102a3513..000000000 --- a/assets/js/834808ff.8a3d2630.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5964],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),h=a,d=u["".concat(l,".").concat(h)]||u[h]||p[h]||s;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,i=new Array(s);i[0]=h;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const s={},i="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/docs/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-registration.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Status Fields",permalink:"/ref-status-fields"},next:{title:"Configuration",permalink:"/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:3},{value:"Creating the Bootstrap Secret for the Downstream Cluster",id:"creating-the-bootstrap-secret-for-the-downstream-cluster",level:3},{value:"Creating the Fleet Agent Deployment",id:"creating-the-fleet-agent-deployment",level:3},{value:"Fleet Agent Starts Registration, Upgrades to Request Account",id:"fleet-agent-starts-registration-upgrades-to-request-account",level:3},{value:"Fleet Agent is Registered, Watches for BundleDeployments",id:"fleet-agent-is-registered-watches-for-bundledeployments",level:3},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Registration Process and Controllers",id:"registration-process-and-controllers",level:3},{value:"Secrets during Agent Deployment",id:"secrets-during-agent-deployment",level:3},{value:"Fleet Cluster Registration in Rancher",id:"fleet-cluster-registration-in-rancher",level:2},{value:"Import Cluster into Rancher",id:"import-cluster-into-rancher",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,n.A)({},g,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h3",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handled by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"The process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h3",{id:"creating-the-bootstrap-secret-for-the-downstream-cluster"},"Creating the Bootstrap Secret for the Downstream Cluster"),(0,a.yg)("p",null,"In this step a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' and an "import" service account are created based on a ',(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("p",null,"The Fleet controller creates a ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken")),"\nand waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' triggers the creation of the "import" service account, which can create\n',(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system"). The ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go"),' controller will\nenqueue itself until the "import" service account exists, because that account is needed to create the ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret."),(0,a.yg)("h3",{id:"creating-the-fleet-agent-deployment"},"Creating the Fleet Agent Deployment"),(0,a.yg)("p",null,"The Fleet controller will now create the Fleet agent deployment and the bootstrap secret on the downstream cluster."),(0,a.yg)("p",null,"The bootstrap secret contains the API server URL of the upstream cluster and is used to build a kubeconfig to access the upstream cluster. Both values are taken from the Fleet controller config configmap. That configmap is part of the helm chart."),(0,a.yg)("h3",{id:"fleet-agent-starts-registration-upgrades-to-request-account"},"Fleet Agent Starts Registration, Upgrades to Request Account"),(0,a.yg)("p",null,'The agent uses the "import" account to upgrade to a request account.'),(0,a.yg)("p",null,"Immediately the Fleet agent checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap"),' secret. If the bootstrap secret, which contains the "import" kubeconfig, is present the agent starts registering.'),(0,a.yg)("p",null,"Then agent creates the final ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret's name."),(0,a.yg)("p",null,"The Fleet controller triggers and tries to grant the ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," request to create agent's service account and create the 'c-","*","' registration secret with the client's new kubeconfig. The registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),"."),(0,a.yg)("p",null,'The new kubeconfig uses the "request" account. The "request" account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"Contents"),"."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"ClusterRegistationToken to ClusterRegistration",src:r(4294).A,width:"1241",height:"689"})),(0,a.yg)("h3",{id:"fleet-agent-is-registered-watches-for-bundledeployments"},"Fleet Agent is Registered, Watches for ",(0,a.yg)("inlineCode",{parentName:"h3"},"BundleDeployments")),(0,a.yg)("p",null,'At this point the agent is fully registered and will persist the "request" account into a ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," secret.\nThe API server URL and CA are copied from the bootstrap secret, which inherited these values from the Fleet controller's helm chart values."),(0,a.yg)("p",null,"The bootstrap secret is deleted. When the agent restarts, it will not re-register, since the bootstrap secret is missing."),(0,a.yg)("p",null,'The agent starts watching its "',(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces#cluster-namespaces"},"Cluster Namespace"),'" for ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),". At this point the agent is ready to deploy workloads."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},'The fleet-default namespace has all the cluster registrations, the "import" account uses a separate namespace.'),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster or namespace change. The ",(0,a.yg)("inlineCode",{parentName:"li"},"manageagent"),' controller will then create a bundle to adopt the existing agent deployment. The agent will update itself to the bundle and since the "generation" environment variable changes, it will restart.'),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"registration-process-and-controllers"},"Registration Process and Controllers"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster."),(0,a.yg)("p",null,"It is important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets-during-agent-deployment"},"Secrets during Agent Deployment"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," controller triggers on Cluster creation/update events and deploys the agent."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"This image shows how the API server URL and CA propagates through the secrets during registration:")),(0,a.yg)("p",null,"The arrows in the diagram show how the API server values are copied from\nthe Helm values to the cluster registration secret on the upstream\ncluster and finally downstream to the bootstrap secret of the agent."),(0,a.yg)("p",null,'There is one special case, if the agent is for the local/"bootstrap"\ncluster, the server values also exist in the kubeconfig secret,\nreferenced by the Cluster resource. In this case the kubeconfig secret\ncontains the upstream server URL and CA, next to the downstream\'s\nkubeconfig. If the settings are present in the kubeconfig secret, they\noverride the configured values.'),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})),(0,a.yg)("h2",{id:"fleet-cluster-registration-in-rancher"},"Fleet Cluster Registration in Rancher"),(0,a.yg)("p",null,"Rancher installs the fleet helm chart. The API server URL and CA are ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/release/v2.9/pkg/controllers/dashboard/fleetcharts/controller.go#L111-L112"},"derived from Rancher's settings"),"."),(0,a.yg)("p",null,"Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller."),(0,a.yg)("h3",{id:"import-cluster-into-rancher"},"Import Cluster into Rancher"),(0,a.yg)("p",null,"When the user runs ",(0,a.yg)("inlineCode",{parentName:"p"},"curl | kubectl apply"),", the applied manifest includes the rancher agent deployment."),(0,a.yg)("p",null,"The deployment contains a secret ",(0,a.yg)("inlineCode",{parentName:"p"},"cattle-credentials-")," which contains the API URL and a token."),(0,a.yg)("p",null,"The Rancher agent starts up and reports downstream's kubeconfig to upstream."),(0,a.yg)("p",null,"Rancher then creates the fleet Cluster resource, which references a ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/871b6d9137246bd93733f01184ea435f40c5d56c/pkg/provisioningv2/kubeconfig/manager.go#L69"},"kubeconfig secret"),"."),(0,a.yg)("p",null,"\ud83d\udc49Fleet will use this kubeconfig to deploy the agent on the downstream cluster."))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"},4294:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationToken-96af9ec264665fd3fef0c450747987ef.svg"}}]); \ No newline at end of file diff --git a/assets/js/847b3bc4.36a1003a.js b/assets/js/847b3bc4.c5fe7a91.js similarity index 76% rename from assets/js/847b3bc4.36a1003a.js rename to assets/js/847b3bc4.c5fe7a91.js index 04f27e67c..1a6de1ee6 100644 --- a/assets/js/847b3bc4.36a1003a.js +++ b/assets/js/847b3bc4.c5fe7a91.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6730],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=l,d=p["".concat(s,".").concat(m)]||p[m]||f[m]||a;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.5/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.5/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.5/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/uninstall.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Multi Cluster Install",permalink:"/0.5/multi-cluster-install"},next:{title:"v0.5.0",permalink:"/0.5/changelogs/changelogs/v0.5.0"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6730],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=l,d=p["".concat(s,".").concat(m)]||p[m]||f[m]||a;return n?r.createElement(d,o(o({ref:t},u),{},{components:n})):r.createElement(d,o({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.5/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.5/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.5/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/uninstall.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Multi Cluster Install",permalink:"/0.5/multi-cluster-install"},next:{title:"v0.5.0",permalink:"/0.5/changelogs/changelogs/v0.5.0"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/857d18b5.172b8c15.js b/assets/js/857d18b5.172b8c15.js new file mode 100644 index 000000000..58fef04a6 --- /dev/null +++ b/assets/js/857d18b5.172b8c15.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1591],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),p=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=p(n),g=a,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?o.createElement(u,r(r({ref:t},c),{},{components:n})):o.createElement(u,r({ref:t},c))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.6/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.6/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.6/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/troubleshooting.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.6/ref-gitrepo"},next:{title:"v0.6.0",permalink:"/0.6/changelogs/changelogs/v0.6.0"}},s={},p=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],c={toc:p},d="wrapper";function h(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled. "),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo. "),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.6/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority" \n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm: \n releaseName: \n repo: \n chart: \ndiff: \n comparePatches: \n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations" \n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/bundle-diffs"},"bundle diffs documentation")," for more information. ")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/857d18b5.55032e63.js b/assets/js/857d18b5.55032e63.js deleted file mode 100644 index edb657a2a..000000000 --- a/assets/js/857d18b5.55032e63.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1591],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),p=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=p(n),g=a,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?o.createElement(u,r(r({ref:t},c),{},{components:n})):o.createElement(u,r({ref:t},c))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.6/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.6/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.6/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/troubleshooting.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.6/ref-gitrepo"},next:{title:"v0.6.0",permalink:"/0.6/changelogs/changelogs/v0.6.0"}},s={},p=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],c={toc:p},d="wrapper";function h(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled. "),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo. "),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.6/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority" \n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm: \n releaseName: \n repo: \n chart: \ndiff: \n comparePatches: \n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations" \n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/bundle-diffs"},"bundle diffs documentation")," for more information. ")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/87469ac3.84f69b9b.js b/assets/js/87469ac3.84f69b9b.js new file mode 100644 index 000000000..ac94be0a8 --- /dev/null +++ b/assets/js/87469ac3.84f69b9b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5198],{5680:(e,t,a)=>{a.d(t,{xA:()=>m,yg:()=>s});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var y=n.createContext({}),p=function(e){var t=n.useContext(y),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},m=function(e){var t=p(e.components);return n.createElement(y.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},N=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,y=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),u=p(a),N=l,s=u["".concat(y,".").concat(N)]||u[N]||d[N]||r;return a?n.createElement(s,g(g({ref:t},m),{},{components:a})):n.createElement(s,g({ref:t},m))}));function s(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=N;var i={};for(var y in t)hasOwnProperty.call(t,y)&&(i[y]=t[y]);i.originalType=e,i[u]="string"==typeof e?e:l,g[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>y,contentTitle:()=>g,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.7/ref-crds",title:"Custom Resources Spec",description:"* GitRepo",source:"@site/versioned_docs/version-0.7/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.7/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-crds.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.7/ref-configuration"},next:{title:"fleet.yaml",permalink:"/0.7/ref-fleet-yaml"}},y={},p=[{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"Bundle",id:"bundle",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"Content",id:"content",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4}],m={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,n.A)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions"))),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for private helm repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of target this repo will deploy to"),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when new image is scanned and write back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contain the actual resources from the git repo which will be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions restrict which clusters the bundle will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"Ignore refers to the fields that will not be considered when monitoring the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"conditions to be ignored"),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/87469ac3.c8a2b7e7.js b/assets/js/87469ac3.c8a2b7e7.js deleted file mode 100644 index c7b251181..000000000 --- a/assets/js/87469ac3.c8a2b7e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5198],{5680:(e,t,a)=>{a.d(t,{xA:()=>m,yg:()=>s});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var y=n.createContext({}),p=function(e){var t=n.useContext(y),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},m=function(e){var t=p(e.components);return n.createElement(y.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},N=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,y=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),u=p(a),N=l,s=u["".concat(y,".").concat(N)]||u[N]||d[N]||r;return a?n.createElement(s,g(g({ref:t},m),{},{components:a})):n.createElement(s,g({ref:t},m))}));function s(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=N;var i={};for(var y in t)hasOwnProperty.call(t,y)&&(i[y]=t[y]);i.originalType=e,i[u]="string"==typeof e?e:l,g[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>y,contentTitle:()=>g,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.7/ref-crds",title:"Custom Resources Spec",description:"* GitRepo",source:"@site/versioned_docs/version-0.7/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.7/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-crds.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.7/ref-configuration"},next:{title:"fleet.yaml",permalink:"/0.7/ref-fleet-yaml"}},y={},p=[{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"Bundle",id:"bundle",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"Content",id:"content",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4}],m={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,n.A)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions"))),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for private helm repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of target this repo will deploy to"),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when new image is scanned and write back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contain the actual resources from the git repo which will be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions restrict which clusters the bundle will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"Ignore refers to the fields that will not be considered when monitoring the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"conditions to be ignored"),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*v1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/88f3f33f.a803775c.js b/assets/js/88f3f33f.aadadc40.js similarity index 67% rename from assets/js/88f3f33f.a803775c.js rename to assets/js/88f3f33f.aadadc40.js index 9764b1b2a..05f1f1ce3 100644 --- a/assets/js/88f3f33f.a803775c.js +++ b/assets/js/88f3f33f.aadadc40.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9832],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.8/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.8/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.8/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cluster-group.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.8/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.8/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9832],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.8/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.8/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.8/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cluster-group.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.8/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.8/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/89c8e819.1d273cb0.js b/assets/js/89c8e819.21d90e3b.js similarity index 58% rename from assets/js/89c8e819.1d273cb0.js rename to assets/js/89c8e819.21d90e3b.js index 730817137..812c2d5c2 100644 --- a/assets/js/89c8e819.1d273cb0.js +++ b/assets/js/89c8e819.21d90e3b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[342],{5680:(e,t,r)=>{r.d(t,{xA:()=>d,yg:()=>u});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},f="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,c=e.parentName,d=a(e,["components","mdxType","originalType","parentName"]),f=s(r),g=o,u=f["".concat(c,".").concat(g)]||f[g]||p[g]||l;return r?n.createElement(u,i(i({ref:t},d),{},{components:r})):n.createElement(u,i({ref:t},d))}));function u(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,i=new Array(l);i[0]=g;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[f]="string"==typeof e?e:o,i[1]=a;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const l={title:"",sidebar_label:"fleetcontroller gitjob"},i=void 0,a={unversionedId:"cli/fleet-controller/fleetcontroller_gitjob",id:"version-0.10/cli/fleet-controller/fleetcontroller_gitjob",title:"",description:"fleetcontroller gitjob",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_gitjob.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_gitjob",permalink:"/0.10/cli/fleet-controller/fleetcontroller_gitjob",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_gitjob.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller gitjob"}},c={},s=[{value:"fleetcontroller gitjob",id:"fleetcontroller-gitjob",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],d={toc:s},f="wrapper";function p(e){let{components:t,...r}=e;return(0,o.yg)(f,(0,n.A)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h2",{id:"fleetcontroller-gitjob"},"fleetcontroller gitjob"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"fleetcontroller gitjob [flags]\n")),(0,o.yg)("h3",{id:"options"},"Options"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")\n -h, --help help for gitjob\n --kubeconfig string Kubeconfig file\n --leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.\n --listen string The port the webhook listens. (default ":8080")\n --metrics-bind-address string The address the metric endpoint binds to. (default ":8081")\n --namespace string namespace to watch (default "cattle-fleet-system")\n')),(0,o.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"}," --disable-metrics disable metrics\n --shard-id string only manage resources labeled with a specific shard ID\n --shard-node-selector string node selector to apply to jobs based on the shard ID, if any\n")),(0,o.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[342],{5680:(e,t,r)=>{r.d(t,{xA:()=>d,yg:()=>u});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},f="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,l=e.originalType,c=e.parentName,d=a(e,["components","mdxType","originalType","parentName"]),f=s(r),g=o,u=f["".concat(c,".").concat(g)]||f[g]||p[g]||l;return r?n.createElement(u,i(i({ref:t},d),{},{components:r})):n.createElement(u,i({ref:t},d))}));function u(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=r.length,i=new Array(l);i[0]=g;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[f]="string"==typeof e?e:o,i[1]=a;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>a,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const l={title:"",sidebar_label:"fleetcontroller gitjob"},i=void 0,a={unversionedId:"cli/fleet-controller/fleetcontroller_gitjob",id:"version-0.10/cli/fleet-controller/fleetcontroller_gitjob",title:"",description:"fleetcontroller gitjob",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_gitjob.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_gitjob",permalink:"/0.10/cli/fleet-controller/fleetcontroller_gitjob",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_gitjob.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller gitjob"}},c={},s=[{value:"fleetcontroller gitjob",id:"fleetcontroller-gitjob",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],d={toc:s},f="wrapper";function p(e){let{components:t,...r}=e;return(0,o.yg)(f,(0,n.A)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h2",{id:"fleetcontroller-gitjob"},"fleetcontroller gitjob"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"fleetcontroller gitjob [flags]\n")),(0,o.yg)("h3",{id:"options"},"Options"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")\n -h, --help help for gitjob\n --kubeconfig string Kubeconfig file\n --leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.\n --listen string The port the webhook listens. (default ":8080")\n --metrics-bind-address string The address the metric endpoint binds to. (default ":8081")\n --namespace string namespace to watch (default "cattle-fleet-system")\n')),(0,o.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"}," --disable-metrics disable metrics\n --shard-id string only manage resources labeled with a specific shard ID\n --shard-node-selector string node selector to apply to jobs based on the shard ID, if any\n")),(0,o.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8c1e922c.c394b58c.js b/assets/js/8c1e922c.c394b58c.js new file mode 100644 index 000000000..2995cb793 --- /dev/null +++ b/assets/js/8c1e922c.c394b58c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4654],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(a),p=l,g=u["".concat(s,".").concat(p)]||u[p]||h[p]||n;return a?r.createElement(g,o(o({ref:t},d),{},{components:a})):r.createElement(g,o({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=p;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.9.6",date:"2024-07-17 16:29:25 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.6",id:"version-0.9/changelogs/changelogs/v0.9.6",title:"v0.9.6",description:"(github-actions[bot]) released this 2024-07-17 1625 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.6.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.6",permalink:"/0.9/changelogs/changelogs/v0.9.6",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.6.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.9.6",date:"2024-07-17 16:29:25 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.5",permalink:"/0.9/changelogs/changelogs/v0.9.5"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(github-actions","[bot]",") released this 2024-07-17 16:29:25 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Honor Helm's MaxHistory when using drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2352976523","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2517","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2517/hovercard",href:"https://github.com/rancher/fleet/pull/2517"},"#2517")),(0,l.yg)("li",null,"Fix drift end-to-end tests and run them in CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2360237616","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2536","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2536/hovercard",href:"https://github.com/rancher/fleet/pull/2536"},"#2536")),(0,l.yg)("li",null,"Ignore status fields during drift detection by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2365961530","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2546","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2546/hovercard",href:"https://github.com/rancher/fleet/pull/2546"},"#2546")),(0,l.yg)("li",null,"Bump gitjob to 0.9.12 and docker/docker to v23.0.13 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2394028270","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2614","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2614/hovercard",href:"https://github.com/rancher/fleet/pull/2614"},"#2614")),(0,l.yg)("li",null,"Add strict TLS mode by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2386591909","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2577","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2577/hovercard",href:"https://github.com/rancher/fleet/pull/2577"},"#2577")),(0,l.yg)("li",null,"Bump go-getter by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2395514580","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2619","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2619/hovercard",href:"https://github.com/rancher/fleet/pull/2619"},"#2619"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.5...v0.9.6"},(0,l.yg)("tt",null,"v0.9.5...v0.9.6"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-agent-0.9.6.tgz"},"fleet-agent-0.9.6.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-0.9.6.tgz"},"fleet-0.9.6.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-crd-0.9.6.tgz"},"fleet-crd-0.9.6.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet_0.9.6_checksums.txt"},"fleet_0.9.6_checksums.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetagent-linux-arm64"},"fleetagent-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.6"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8c1e922c.ff714f63.js b/assets/js/8c1e922c.ff714f63.js deleted file mode 100644 index 05af3e36d..000000000 --- a/assets/js/8c1e922c.ff714f63.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4654],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(a),p=l,g=u["".concat(s,".").concat(p)]||u[p]||h[p]||n;return a?r.createElement(g,o(o({ref:t},d),{},{components:a})):r.createElement(g,o({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=p;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.9.6",date:"2024-07-17 16:29:25 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.6",id:"version-0.9/changelogs/changelogs/v0.9.6",title:"v0.9.6",description:"(github-actions[bot]) released this 2024-07-17 1625 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.6.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.6",permalink:"/0.9/changelogs/changelogs/v0.9.6",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.6.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.9.6",date:"2024-07-17 16:29:25 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.5",permalink:"/0.9/changelogs/changelogs/v0.9.5"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(github-actions","[bot]",") released this 2024-07-17 16:29:25 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Honor Helm's MaxHistory when using drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2352976523","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2517","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2517/hovercard",href:"https://github.com/rancher/fleet/pull/2517"},"#2517")),(0,l.yg)("li",null,"Fix drift end-to-end tests and run them in CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2360237616","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2536","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2536/hovercard",href:"https://github.com/rancher/fleet/pull/2536"},"#2536")),(0,l.yg)("li",null,"Ignore status fields during drift detection by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2365961530","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2546","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2546/hovercard",href:"https://github.com/rancher/fleet/pull/2546"},"#2546")),(0,l.yg)("li",null,"Bump gitjob to 0.9.12 and docker/docker to v23.0.13 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2394028270","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2614","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2614/hovercard",href:"https://github.com/rancher/fleet/pull/2614"},"#2614")),(0,l.yg)("li",null,"Add strict TLS mode by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2386591909","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2577","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2577/hovercard",href:"https://github.com/rancher/fleet/pull/2577"},"#2577")),(0,l.yg)("li",null,"Bump go-getter by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2395514580","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2619","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2619/hovercard",href:"https://github.com/rancher/fleet/pull/2619"},"#2619"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.5...v0.9.6"},(0,l.yg)("tt",null,"v0.9.5...v0.9.6"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-agent-0.9.6.tgz"},"fleet-agent-0.9.6.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-0.9.6.tgz"},"fleet-0.9.6.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-crd-0.9.6.tgz"},"fleet-crd-0.9.6.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet_0.9.6_checksums.txt"},"fleet_0.9.6_checksums.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.6/fleetagent-linux-arm64"},"fleetagent-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.6"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8cc21d50.fead5b54.js b/assets/js/8cc21d50.fcd06c2d.js similarity index 64% rename from assets/js/8cc21d50.fead5b54.js rename to assets/js/8cc21d50.fcd06c2d.js index a7e0b1c77..e28730b18 100644 --- a/assets/js/8cc21d50.fead5b54.js +++ b/assets/js/8cc21d50.fcd06c2d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9047],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=l.createContext({}),p=function(e){var t=l.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},f="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),f=p(n),d=r,g=f["".concat(c,".").concat(d)]||f[d]||s[d]||a;return n?l.createElement(g,i(i({ref:t},u),{},{components:n})):l.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[f]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>o,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet cleanup"},i=void 0,o={unversionedId:"cli/fleet-cli/fleet_cleanup",id:"version-0.10/cli/fleet-cli/fleet_cleanup",title:"",description:"fleet cleanup",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_cleanup.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_cleanup",permalink:"/0.10/cli/fleet-cli/fleet_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_cleanup.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet cleanup"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.10/cli/fleet-cli/fleet_apply"},next:{title:"fleet deploy",permalink:"/0.10/cli/fleet-cli/fleet_deploy"}},c={},p=[{value:"fleet cleanup",id:"fleet-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:p},f="wrapper";function s(e){let{components:t,...n}=e;return(0,r.yg)(f,(0,l.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-cleanup"},"fleet cleanup"),(0,r.yg)("p",null,"Clean up outdated cluster registrations"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet cleanup [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --factor string Factor to increase delay between deletes (default: 1.1)\n -h, --help help for cleanup\n -k, --kubeconfig string kubeconfig for authentication\n --max string Maximum delay between deletes (default: 5s)\n --min string Minimum delay between deletes (default: 10ms)\n -n, --namespace string namespace (default "fleet-local")\n')),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9047],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=l.createContext({}),p=function(e){var t=l.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},f="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),f=p(n),d=r,g=f["".concat(c,".").concat(d)]||f[d]||s[d]||a;return n?l.createElement(g,i(i({ref:t},u),{},{components:n})):l.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[f]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>o,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet cleanup"},i=void 0,o={unversionedId:"cli/fleet-cli/fleet_cleanup",id:"version-0.10/cli/fleet-cli/fleet_cleanup",title:"",description:"fleet cleanup",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_cleanup.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_cleanup",permalink:"/0.10/cli/fleet-cli/fleet_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_cleanup.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet cleanup"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.10/cli/fleet-cli/fleet_apply"},next:{title:"fleet deploy",permalink:"/0.10/cli/fleet-cli/fleet_deploy"}},c={},p=[{value:"fleet cleanup",id:"fleet-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:p},f="wrapper";function s(e){let{components:t,...n}=e;return(0,r.yg)(f,(0,l.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-cleanup"},"fleet cleanup"),(0,r.yg)("p",null,"Clean up outdated cluster registrations"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet cleanup [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --factor string Factor to increase delay between deletes (default: 1.1)\n -h, --help help for cleanup\n -k, --kubeconfig string kubeconfig for authentication\n --max string Maximum delay between deletes (default: 5s)\n --min string Minimum delay between deletes (default: 10ms)\n -n, --namespace string namespace (default "fleet-local")\n')),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8eb509d6.e1f559b3.js b/assets/js/8eb509d6.a5303514.js similarity index 71% rename from assets/js/8eb509d6.e1f559b3.js rename to assets/js/8eb509d6.a5303514.js index 62bd67a2c..9f383108a 100644 --- a/assets/js/8eb509d6.e1f559b3.js +++ b/assets/js/8eb509d6.a5303514.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1074],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.6/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.6/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.6/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.6/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.6/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable agent on local cluster\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1074],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.6/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.6/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.6/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.6/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.6/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable agent on local cluster\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8ff6a575.c8aa30eb.js b/assets/js/8ff6a575.c8aa30eb.js new file mode 100644 index 000000000..13188fe62 --- /dev/null +++ b/assets/js/8ff6a575.c8aa30eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3743],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7458:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.7/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.7/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.7/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/tut-deployment.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.7/quickstart"},next:{title:"Uninstall",permalink:"/0.7/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.7/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/docs/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-bundle.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/904bb95d.c9d9f169.js b/assets/js/904bb95d.c9d9f169.js deleted file mode 100644 index ba5e867db..000000000 --- a/assets/js/904bb95d.c9d9f169.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[610],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/docs/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-bundle.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/909a121f.2f5457ba.js b/assets/js/909a121f.2f5457ba.js new file mode 100644 index 000000000..2a70248b2 --- /dev/null +++ b/assets/js/909a121f.2f5457ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1662],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(n),u=r,y=m["".concat(s,".").concat(u)]||m[u]||c[u]||l;return n?a.createElement(y,i(i({ref:t},d),{},{components:n})):a.createElement(y,i({ref:t},d))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[m]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.7/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.7/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.7/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/gitrepo-content.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.7/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.7/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],d={toc:p},m="wrapper";function c(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.7/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.7/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.7/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/909a121f.4273df39.js b/assets/js/909a121f.4273df39.js deleted file mode 100644 index ba5a61524..000000000 --- a/assets/js/909a121f.4273df39.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1662],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(n),u=r,y=m["".concat(s,".").concat(u)]||m[u]||c[u]||l;return n?a.createElement(y,i(i({ref:t},d),{},{components:n})):a.createElement(y,i({ref:t},d))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=u;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[m]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const l={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"version-0.7/gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.7/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/0.7/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/gitrepo-content.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/0.7/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/0.7/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2}],d={toc:p},m="wrapper";function c(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.7/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.7/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.7/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.7/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/916f8434.6c258757.js b/assets/js/916f8434.6c258757.js deleted file mode 100644 index e1e68837d..000000000 --- a/assets/js/916f8434.6c258757.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[108],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=o,f=u["".concat(l,".").concat(d)]||u[d]||h[d]||a;return n?r.createElement(f,i(i({ref:t},p),{},{components:n})):r.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const a={},i="GitRepo Resource",s={unversionedId:"ref-gitrepo",id:"version-0.10/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.10/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.10/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-gitrepo.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.10/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.10/ref-bundle"}},l={},c=[],p={toc:c},u="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private git repository you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n\n # Contains the auth secret for private Helm repository for each path.\n # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)\n #\n # helmSecretNameForPaths: multi-helm-secret\n\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # When disablePolling is set to true the git repo won\'t be checked periodically.\n # It will rely on webhooks only.\n # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)\n # disablePolling: false\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default.\n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating\n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/916f8434.a5766fc4.js b/assets/js/916f8434.a5766fc4.js new file mode 100644 index 000000000..9557893d3 --- /dev/null +++ b/assets/js/916f8434.a5766fc4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[108],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=o,f=u["".concat(l,".").concat(d)]||u[d]||h[d]||a;return n?r.createElement(f,i(i({ref:t},p),{},{components:n})):r.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const a={},i="GitRepo Resource",s={unversionedId:"ref-gitrepo",id:"version-0.10/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.10/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.10/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-gitrepo.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.10/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/0.10/ref-bundle"}},l={},c=[],p={toc:c},u="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.10/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private git repository you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n\n # Contains the auth secret for private Helm repository for each path.\n # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)\n #\n # helmSecretNameForPaths: multi-helm-secret\n\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # When disablePolling is set to true the git repo won\'t be checked periodically.\n # It will rely on webhooks only.\n # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)\n # disablePolling: false\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default.\n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating\n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/922074e2.22dbfe29.js b/assets/js/922074e2.22dbfe29.js deleted file mode 100644 index 30c2288d0..000000000 --- a/assets/js/922074e2.22dbfe29.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3840],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),m=a,c=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"version-0.8/ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/versioned_docs/version-0.8/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.8/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-resources.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.8/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/0.8/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/922074e2.aa431441.js b/assets/js/922074e2.aa431441.js new file mode 100644 index 000000000..048db166a --- /dev/null +++ b/assets/js/922074e2.aa431441.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3840],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),m=a,c=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"version-0.8/ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/versioned_docs/version-0.8/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.8/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-resources.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.8/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/0.8/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9533a6b7.14e38ec6.js b/assets/js/9533a6b7.14e38ec6.js new file mode 100644 index 000000000..fa3a7f25f --- /dev/null +++ b/assets/js/9533a6b7.14e38ec6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8471],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),g=a,m=u["".concat(i,".").concat(g)]||u[g]||d[g]||l;return r?n.createElement(m,o(o({ref:t},p),{},{components:r})):n.createElement(m,o({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const l={},o="Mapping to Downstream Clusters",s={unversionedId:"gitrepo-targets",id:"version-0.5/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Multi-cluster Only:",source:"@site/versioned_docs/version-0.5/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.5/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/gitrepo-targets.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Expected Repo Structure",permalink:"/0.5/gitrepo-structure"},next:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.5/bundle-diffs"}},i={},c=[{value:"Defining targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default target",id:"default-target",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style")),(0,a.yg)("p",null,"When deploying ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,a.yg)("h2",{id:"defining-targets"},"Defining targets"),(0,a.yg)("p",null,"The deployment targets of ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,a.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n')),(0,a.yg)("h2",{id:"target-matching"},"Target Matching"),(0,a.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,a.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,a.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,a.yg)("h2",{id:"default-target"},"Default target"),(0,a.yg)("p",null,"If no target is set for the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,a.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9533a6b7.3923ebe7.js b/assets/js/9533a6b7.3923ebe7.js deleted file mode 100644 index cf837f2bc..000000000 --- a/assets/js/9533a6b7.3923ebe7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8471],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),g=a,m=u["".concat(i,".").concat(g)]||u[g]||d[g]||l;return r?n.createElement(m,o(o({ref:t},p),{},{components:r})):n.createElement(m,o({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const l={},o="Mapping to Downstream Clusters",s={unversionedId:"gitrepo-targets",id:"version-0.5/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Multi-cluster Only:",source:"@site/versioned_docs/version-0.5/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.5/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/gitrepo-targets.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Expected Repo Structure",permalink:"/0.5/gitrepo-structure"},next:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.5/bundle-diffs"}},i={},c=[{value:"Defining targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default target",id:"default-target",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style")),(0,a.yg)("p",null,"When deploying ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,a.yg)("h2",{id:"defining-targets"},"Defining targets"),(0,a.yg)("p",null,"The deployment targets of ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,a.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n')),(0,a.yg)("h2",{id:"target-matching"},"Target Matching"),(0,a.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,a.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,a.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,a.yg)("h2",{id:"default-target"},"Default target"),(0,a.yg)("p",null,"If no target is set for the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,a.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/95a72457.373c139f.js b/assets/js/95a72457.373c139f.js new file mode 100644 index 000000000..cdb42fa28 --- /dev/null +++ b/assets/js/95a72457.373c139f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1599],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),c=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?a.createElement(g,l(l({ref:t},p),{},{components:n})):a.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:r,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/docs/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/multi-user.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/gitrepo-add"}},i={},c=[{value:"Example Fleet Standalone",id:"example-fleet-standalone",level:2},{value:"Example Fleet in Rancher",id:"example-fleet-in-rancher",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,r.yg)(u,(0,a.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,r.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,r.yg)("p",null,"One addition on top of RBAC is the ",(0,r.yg)("a",{parentName:"p",href:"/namespaces#restricting-gitrepos"},(0,r.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,r.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,r.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,r.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,r.yg)("admonition",{title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,r.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,r.yg)("h2",{id:"example-fleet-standalone"},"Example Fleet Standalone"),(0,r.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,r.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,r.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,r.yg)("h2",{id:"example-fleet-in-rancher"},"Example Fleet in Rancher"),(0,r.yg)("p",null,"When a new fleet workspace is created, a corresponding namespace with an identical name is automatically generated within the Rancher local cluster.\nFor a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"list/get the ",(0,r.yg)("inlineCode",{parentName:"li"},"fleetworkspace")," cluster-wide resource in the local cluster"),(0,r.yg)("li",{parentName:"ul"},"Permissions to create fleet resources (such as ",(0,r.yg)("inlineCode",{parentName:"li"},"bundles"),", ",(0,r.yg)("inlineCode",{parentName:"li"},"gitrepos"),", ...) in the backing namespace for the workspace in the local cluster. ")),(0,r.yg)("p",null,"Let's grant permissions to deploy fleet resources in the ",(0,r.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"project2")," fleet workspaces:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"To create the ",(0,r.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces, you can either do it in the ",(0,r.yg)("a",{parentName:"li",href:"https://ranchermanager.docs.rancher.com/integrations-in-rancher/fleet/overview#accessing-fleet-in-the-rancher-ui"},"Rancher UI")," or use the following YAML resources:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project1\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project2\n")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Create a ",(0,r.yg)("inlineCode",{parentName:"li"},"GlobalRole")," that grants permission to deploy fleet resources in the ",(0,r.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: GlobalRole\nmetadata:\n name: fleet-projects1and2\nnamespacedRules:\n project1:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\n project2:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\nrules:\n - apiGroups:\n - management.cattle.io\n resourceNames:\n - project1\n - project2\n resources:\n - fleetworkspaces\n verbs:\n - '*'\n")),(0,r.yg)("p",null,"Assign the ",(0,r.yg)("inlineCode",{parentName:"p"},"GlobalRole")," to users or groups, more info can be found in the ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/authentication-permissions-and-global-configuration/manage-role-based-access-control-rbac/global-permissions#configuring-global-permissions-for-individual-users"},"Rancher docs")),(0,r.yg)("p",null,"The user now has access to the ",(0,r.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," tab in Rancher and can deploy resources to both the ",(0,r.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"project2")," workspaces."),(0,r.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,r.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,r.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,r.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,r.yg)("a",{parentName:"p",href:"/namespaces#cross-namespace-deployments"},(0,r.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,r.yg)("p",null,"The ",(0,r.yg)("a",{parentName:"p",href:"/gitrepo-targets"},(0,r.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,r.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,r.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,r.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,r.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,r.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,r.yg)("p",null,"This includes the ",(0,r.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,r.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,r.yg)("p",null,"Together with the previous ",(0,r.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,r.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/95a72457.a48f9e58.js b/assets/js/95a72457.a48f9e58.js deleted file mode 100644 index d63eb8d69..000000000 --- a/assets/js/95a72457.a48f9e58.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1599],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),c=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?a.createElement(g,l(l({ref:t},p),{},{components:n})):a.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:r,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/docs/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/multi-user.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/gitrepo-add"}},i={},c=[{value:"Example Fleet Standalone",id:"example-fleet-standalone",level:2},{value:"Example Fleet in Rancher",id:"example-fleet-in-rancher",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,r.yg)(u,(0,a.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,r.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,r.yg)("p",null,"One addition on top of RBAC is the ",(0,r.yg)("a",{parentName:"p",href:"/namespaces#restricting-gitrepos"},(0,r.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,r.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,r.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,r.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,r.yg)("admonition",{title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,r.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,r.yg)("h2",{id:"example-fleet-standalone"},"Example Fleet Standalone"),(0,r.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,r.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,r.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,r.yg)("h2",{id:"example-fleet-in-rancher"},"Example Fleet in Rancher"),(0,r.yg)("p",null,"When a new fleet workspace is created, a corresponding namespace with an identical name is automatically generated within the Rancher local cluster.\nFor a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"list/get the ",(0,r.yg)("inlineCode",{parentName:"li"},"fleetworkspace")," cluster-wide resource in the local cluster"),(0,r.yg)("li",{parentName:"ul"},"Permissions to create fleet resources (such as ",(0,r.yg)("inlineCode",{parentName:"li"},"bundles"),", ",(0,r.yg)("inlineCode",{parentName:"li"},"gitrepos"),", ...) in the backing namespace for the workspace in the local cluster. ")),(0,r.yg)("p",null,"Let's grant permissions to deploy fleet resources in the ",(0,r.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"project2")," fleet workspaces:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"To create the ",(0,r.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces, you can either do it in the ",(0,r.yg)("a",{parentName:"li",href:"https://ranchermanager.docs.rancher.com/integrations-in-rancher/fleet/overview#accessing-fleet-in-the-rancher-ui"},"Rancher UI")," or use the following YAML resources:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project1\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project2\n")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Create a ",(0,r.yg)("inlineCode",{parentName:"li"},"GlobalRole")," that grants permission to deploy fleet resources in the ",(0,r.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: GlobalRole\nmetadata:\n name: fleet-projects1and2\nnamespacedRules:\n project1:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\n project2:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\nrules:\n - apiGroups:\n - management.cattle.io\n resourceNames:\n - project1\n - project2\n resources:\n - fleetworkspaces\n verbs:\n - '*'\n")),(0,r.yg)("p",null,"Assign the ",(0,r.yg)("inlineCode",{parentName:"p"},"GlobalRole")," to users or groups, more info can be found in the ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/authentication-permissions-and-global-configuration/manage-role-based-access-control-rbac/global-permissions#configuring-global-permissions-for-individual-users"},"Rancher docs")),(0,r.yg)("p",null,"The user now has access to the ",(0,r.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," tab in Rancher and can deploy resources to both the ",(0,r.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"project2")," workspaces."),(0,r.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,r.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,r.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,r.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,r.yg)("a",{parentName:"p",href:"/namespaces#cross-namespace-deployments"},(0,r.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,r.yg)("p",null,"The ",(0,r.yg)("a",{parentName:"p",href:"/gitrepo-targets"},(0,r.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,r.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,r.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,r.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,r.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,r.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,r.yg)("p",null,"This includes the ",(0,r.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,r.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,r.yg)("p",null,"Together with the previous ",(0,r.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,r.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/963c03f5.9347ac22.js b/assets/js/963c03f5.9347ac22.js new file mode 100644 index 000000000..084ecc753 --- /dev/null +++ b/assets/js/963c03f5.9347ac22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2436],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),g=c(n),f=l,m=g["".concat(s,".").concat(f)]||g[f]||p[f]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[g]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.7/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.7/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.7/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-configuration.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.7/ref-registration"},next:{title:"Custom Resources Spec",permalink:"/0.7/ref-crds"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},g="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(g,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/963c03f5.c7301bad.js b/assets/js/963c03f5.c7301bad.js deleted file mode 100644 index 5f3ec7b3c..000000000 --- a/assets/js/963c03f5.c7301bad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2436],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),g=c(n),f=l,m=g["".concat(s,".").concat(f)]||g[f]||p[f]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[g]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.7/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.7/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.7/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-configuration.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.7/ref-registration"},next:{title:"Custom Resources Spec",permalink:"/0.7/ref-crds"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},g="wrapper";function p(e){let{components:t,...n}=e;return(0,l.yg)(g,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/96465f27.41497b52.js b/assets/js/96465f27.41497b52.js deleted file mode 100644 index 36db639bd..000000000 --- a/assets/js/96465f27.41497b52.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5116],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.8/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.8/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.8/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/bundle-diffs.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.8/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.8/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/96465f27.aa834614.js b/assets/js/96465f27.aa834614.js new file mode 100644 index 000000000..34bc17ce1 --- /dev/null +++ b/assets/js/96465f27.aa834614.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5116],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.8/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.8/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.8/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/bundle-diffs.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.8/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.8/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/97c3cd43.49666ba8.js b/assets/js/97c3cd43.d6e480a1.js similarity index 63% rename from assets/js/97c3cd43.49666ba8.js rename to assets/js/97c3cd43.d6e480a1.js index 9c92bd7a7..a1ebce054 100644 --- a/assets/js/97c3cd43.49666ba8.js +++ b/assets/js/97c3cd43.d6e480a1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6447],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:l,o[1]=i;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.7/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.7/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.7/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-cli/fleet.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.7/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.7/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6447],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:l,o[1]=i;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.7/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.7/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.7/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-cli/fleet.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.7/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.7/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/97d7d53e.a6e52dc0.js b/assets/js/97d7d53e.600916f3.js similarity index 54% rename from assets/js/97d7d53e.a6e52dc0.js rename to assets/js/97d7d53e.600916f3.js index 28068ee98..925718701 100644 --- a/assets/js/97d7d53e.a6e52dc0.js +++ b/assets/js/97d7d53e.600916f3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3733],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.9/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.9/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet_test.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.9/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.9/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3733],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.9/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.9/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet_test.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.9/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.9/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/984cdf04.88c1f699.js b/assets/js/984cdf04.88c1f699.js deleted file mode 100644 index a68f1db26..000000000 --- a/assets/js/984cdf04.88c1f699.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[437],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},4443:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.6/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.6/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.6/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/tut-deployment.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.6/quickstart"},next:{title:"Uninstall",permalink:"/0.6/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.6/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},4443:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.6/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.6/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.6/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/tut-deployment.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.6/quickstart"},next:{title:"Uninstall",permalink:"/0.6/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.6/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.7/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.7/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.7/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/imagescan.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.7/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.7/bundle-add"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9c942e60.c223a63a.js b/assets/js/9c942e60.c223a63a.js new file mode 100644 index 000000000..4e0f9d7ca --- /dev/null +++ b/assets/js/9c942e60.c223a63a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8389],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.7/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.7/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.7/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/imagescan.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.7/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.7/bundle-add"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f531b716.8806dd95.js b/assets/js/9d91368e.8746815c.js similarity index 61% rename from assets/js/f531b716.8806dd95.js rename to assets/js/9d91368e.8746815c.js index 688cccd4a..85f8c2341 100644 --- a/assets/js/f531b716.8806dd95.js +++ b/assets/js/9d91368e.8746815c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2148],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.6/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.6/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.6/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/imagescan.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.6/webhook"},next:{title:"fleet-agent",permalink:"/0.6/cli/fleet-agent/"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order \n- policy: \n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver: \n range: "*" \n # can use ascending or descending order\n alphabetical:\n order: asc \n\n # specify images to scan\n image: "your.registry.com/repo/image" \n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret \n\n # Specify the scan interval\n interval: 5m \n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples \n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m \n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret \n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3812],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.8/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.8/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.8/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/imagescan.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.8/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.8/bundle-add"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d91368e.b4ba518e.js b/assets/js/9d91368e.b4ba518e.js deleted file mode 100644 index 74b0f3499..000000000 --- a/assets/js/9d91368e.b4ba518e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3812],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.8/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.8/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.8/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/imagescan.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.8/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.8/bundle-add"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d9f8394.17b5d278.js b/assets/js/9d9f8394.17b5d278.js new file mode 100644 index 000000000..eac330cc6 --- /dev/null +++ b/assets/js/9d9f8394.17b5d278.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9013],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=o,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?a.createElement(u,r(r({ref:t},p),{},{components:n})):a.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:o,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),o=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/docs/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/troubleshooting.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/ref-bundle"},next:{title:"Next \ud83d\udea7",permalink:"/changelogs/changelogs/next"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3},{value:"Bundle failed to deploy: "resource already exists" Error",id:"bundle-failed-to-deploy-resource-already-exists-error",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,o.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,o.yg)("h2",{id:"how-do-i"},(0,o.yg)("strong",{parentName:"h2"},"How Do I...")),(0,o.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"In the local management cluster where the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,o.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,o.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,o.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,o.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,o.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,o.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,o.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("a",{parentName:"p",href:"/troubleshooting#fetch-the-log-from-fleet-controller"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,o.yg)("a",{parentName:"p",href:"/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,o.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,o.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,o.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,o.yg)("p",null,"The pods will usually have images named ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,o.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"You can check the status of the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,o.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Go to the ",(0,o.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,o.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,o.yg)("li",{parentName:"ul"},"Select ",(0,o.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,o.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,o.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,o.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,o.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,o.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,o.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,o.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"For CRD terms like ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,o.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,o.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Create a ",(0,o.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,o.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,o.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,o.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,o.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,o.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,o.yg)("a",{parentName:"p",href:"/ref-fleet-yaml"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,o.yg)("p",null,"Perform the following steps to assess:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,o.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,o.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,o.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,o.yg)("p",null,"Please verify your certificate with the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,o.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,o.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,o.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,o.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,o.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,o.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,o.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"Check the ",(0,o.yg)("a",{parentName:"p",href:"/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"You can also force update the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,o.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,o.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,o.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,o.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,o.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,o.yg)("p",null,"You must define a patch in the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,o.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,o.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,o.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,o.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,o.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,o.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,o.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update")),(0,o.yg)("admonition",{type:"caution"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,o.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,o.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,o.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,o.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,o.yg)("p",null,"When you see an error like the one below ..."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,o.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,o.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,o.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,o.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,o.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,o.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."),(0,o.yg)("h3",{id:"bundle-failed-to-deploy-resource-already-exists-error"},'Bundle failed to deploy: "resource already exists" Error'),(0,o.yg)("p",null,"If your bundle encounters the following error message during deployment:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'not installed: rendered manifests contain a resource that already\nexists. Unable to continue with install: ClusterRole "grafana-clusterrole"\nin namespace "" exists and cannot be imported into the current release: invalid\nownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"\nmust equal "ns-2": current value is "ns-1"\n')),(0,o.yg)("p",null,"This error occurs because a Helm resource with the same ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," already exists in the cluster. To resolve this issue, you need to change the ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," of the resource you want to create to avoid the conflict."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d9f8394.f8091fe4.js b/assets/js/9d9f8394.f8091fe4.js deleted file mode 100644 index a3169a1b2..000000000 --- a/assets/js/9d9f8394.f8091fe4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9013],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=o,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?a.createElement(u,r(r({ref:t},p),{},{components:n})):a.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:o,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),o=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/docs/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/troubleshooting.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/ref-bundle"},next:{title:"Next \ud83d\udea7",permalink:"/changelogs/changelogs/next"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3},{value:"Bundle failed to deploy: "resource already exists" Error",id:"bundle-failed-to-deploy-resource-already-exists-error",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,o.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,o.yg)("h2",{id:"how-do-i"},(0,o.yg)("strong",{parentName:"h2"},"How Do I...")),(0,o.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"In the local management cluster where the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,o.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,o.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,o.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,o.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,o.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,o.yg)("li",{parentName:"ul"},"Check the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,o.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,o.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,o.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,o.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,o.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("a",{parentName:"p",href:"/troubleshooting#fetch-the-log-from-fleet-controller"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,o.yg)("a",{parentName:"p",href:"/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,o.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,o.yg)("p",null,"Check the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,o.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,o.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,o.yg)("p",null,"The pods will usually have images named ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,o.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,o.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,o.yg)("p",null,"You can check the status of the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,o.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,o.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,o.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Go to the ",(0,o.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,o.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,o.yg)("li",{parentName:"ul"},"Select ",(0,o.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,o.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,o.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,o.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,o.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,o.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,o.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,o.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"For CRD terms like ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,o.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,o.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,o.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,o.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,o.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"Create a ",(0,o.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,o.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,o.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,o.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,o.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,o.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,o.yg)("a",{parentName:"p",href:"/ref-fleet-yaml"},(0,o.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,o.yg)("p",null,"Perform the following steps to assess:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,o.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,o.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,o.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,o.yg)("p",null,"Please verify your certificate with the following command:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,o.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,o.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,o.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,o.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,o.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,o.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,o.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"Check the ",(0,o.yg)("a",{parentName:"p",href:"/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,o.yg)("li",{parentName:"ol"},(0,o.yg)("p",{parentName:"li"},"You can also force update the ",(0,o.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,o.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,o.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,o.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,o.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,o.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,o.yg)("p",null,"You must define a patch in the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,o.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,o.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,o.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,o.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,o.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,o.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,o.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,o.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,o.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,o.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,o.yg)("strong",{parentName:"p"},"Force Update")),(0,o.yg)("admonition",{type:"caution"},(0,o.yg)("p",{parentName:"admonition"},(0,o.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,o.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,o.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,o.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,o.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,o.yg)("p",null,"When you see an error like the one below ..."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,o.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,o.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,o.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,o.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,o.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,o.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."),(0,o.yg)("h3",{id:"bundle-failed-to-deploy-resource-already-exists-error"},'Bundle failed to deploy: "resource already exists" Error'),(0,o.yg)("p",null,"If your bundle encounters the following error message during deployment:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-sh"},'not installed: rendered manifests contain a resource that already\nexists. Unable to continue with install: ClusterRole "grafana-clusterrole"\nin namespace "" exists and cannot be imported into the current release: invalid\nownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"\nmust equal "ns-2": current value is "ns-1"\n')),(0,o.yg)("p",null,"This error occurs because a Helm resource with the same ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," already exists in the cluster. To resolve this issue, you need to change the ",(0,o.yg)("inlineCode",{parentName:"p"},"releaseName")," of the resource you want to create to avoid the conflict."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9db89767.868f644a.js b/assets/js/9db89767.868f644a.js deleted file mode 100644 index ecc495ec3..000000000 --- a/assets/js/9db89767.868f644a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9211],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.7/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.7/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.7/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/multi-user.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.7/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.7/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.7/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.7/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/9db89767.9717f697.js b/assets/js/9db89767.9717f697.js new file mode 100644 index 000000000..e764947e5 --- /dev/null +++ b/assets/js/9db89767.9717f697.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9211],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.7/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.7/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.7/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/multi-user.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.7/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.7/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.7/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.7/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/9dcacd54.6d946ed1.js b/assets/js/9dcacd54.6d946ed1.js deleted file mode 100644 index 90562257f..000000000 --- a/assets/js/9dcacd54.6d946ed1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5002],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.10/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.10/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.10/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-bundle.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.10/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.10/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.10/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9dcacd54.e45b7503.js b/assets/js/9dcacd54.e45b7503.js new file mode 100644 index 000000000..7e776614d --- /dev/null +++ b/assets/js/9dcacd54.e45b7503.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5002],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.10/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.10/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.10/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-bundle.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.10/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.10/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.10/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e8ad6e8.ccc62409.js b/assets/js/9e8ad6e8.ccc62409.js new file mode 100644 index 000000000..68a149264 --- /dev/null +++ b/assets/js/9e8ad6e8.ccc62409.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8529],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),h=a,d=u["".concat(l,".").concat(h)]||u[h]||p[h]||s;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,i=new Array(s);i[0]=h;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const s={},i="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"version-0.10/ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/versioned_docs/version-0.10/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.10/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-registration.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Resources List",permalink:"/0.10/resource-counts-and-resources-list"},next:{title:"Configuration",permalink:"/0.10/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:3},{value:"Creating the Bootstrap Secret for the Downstream Cluster",id:"creating-the-bootstrap-secret-for-the-downstream-cluster",level:3},{value:"Creating the Fleet Agent Deployment",id:"creating-the-fleet-agent-deployment",level:3},{value:"Fleet Agent Starts Registration, Upgrades to Request Account",id:"fleet-agent-starts-registration-upgrades-to-request-account",level:3},{value:"Fleet Agent is Registered, Watches for BundleDeployments",id:"fleet-agent-is-registered-watches-for-bundledeployments",level:3},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Registration Process and Controllers",id:"registration-process-and-controllers",level:3},{value:"Secrets during Agent Deployment",id:"secrets-during-agent-deployment",level:3},{value:"Fleet Cluster Registration in Rancher",id:"fleet-cluster-registration-in-rancher",level:2},{value:"Import Cluster into Rancher",id:"import-cluster-into-rancher",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,n.A)({},g,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/0.10/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/0.10/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/0.10/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h3",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handled by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"The process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h3",{id:"creating-the-bootstrap-secret-for-the-downstream-cluster"},"Creating the Bootstrap Secret for the Downstream Cluster"),(0,a.yg)("p",null,"In this step a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' and an "import" service account are created based on a ',(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("p",null,"The Fleet controller creates a ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken")),"\nand waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' triggers the creation of the "import" service account, which can create\n',(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system"). The ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go"),' controller will\nenqueue itself until the "import" service account exists, because that account is needed to create the ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret."),(0,a.yg)("h3",{id:"creating-the-fleet-agent-deployment"},"Creating the Fleet Agent Deployment"),(0,a.yg)("p",null,"The Fleet controller will now create the Fleet agent deployment and the bootstrap secret on the downstream cluster."),(0,a.yg)("p",null,"The bootstrap secret contains the API server URL of the upstream cluster and is used to build a kubeconfig to access the upstream cluster. Both values are taken from the Fleet controller config configmap. That configmap is part of the helm chart."),(0,a.yg)("h3",{id:"fleet-agent-starts-registration-upgrades-to-request-account"},"Fleet Agent Starts Registration, Upgrades to Request Account"),(0,a.yg)("p",null,'The agent uses the "import" account to upgrade to a request account.'),(0,a.yg)("p",null,"Immediately the Fleet agent checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap"),' secret. If the bootstrap secret, which contains the "import" kubeconfig, is present the agent starts registering.'),(0,a.yg)("p",null,"Then agent creates the final ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret's name."),(0,a.yg)("p",null,"The Fleet controller triggers and tries to grant the ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," request to create agent's service account and create the 'c-","*","' registration secret with the client's new kubeconfig. The registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),"."),(0,a.yg)("p",null,'The new kubeconfig uses the "request" account. The "request" account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"Contents"),"."),(0,a.yg)("h3",{id:"fleet-agent-is-registered-watches-for-bundledeployments"},"Fleet Agent is Registered, Watches for ",(0,a.yg)("inlineCode",{parentName:"h3"},"BundleDeployments")),(0,a.yg)("p",null,'At this point the agent is fully registered and will persist the "request" account into a ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," secret.\nThe API server URL and CA are copied from the bootstrap secret, which inherited these values from the Fleet controller's helm chart values."),(0,a.yg)("p",null,"The bootstrap secret is deleted. When the agent restarts, it will not re-register, since the bootstrap secret is missing."),(0,a.yg)("p",null,'The agent starts watching its "',(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces#cluster-namespaces"},"Cluster Namespace"),'" for ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),". At this point the agent is ready to deploy workloads."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},'The fleet-default namespace has all the cluster registrations, the "import" account uses a separate namespace.'),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster or namespace change. The ",(0,a.yg)("inlineCode",{parentName:"li"},"manageagent"),' controller will then create a bundle to adopt the existing agent deployment. The agent will update itself to the bundle and since the "generation" environment variable changes, it will restart.'),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"registration-process-and-controllers"},"Registration Process and Controllers"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster."),(0,a.yg)("p",null,"It is important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.10/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.10/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets-during-agent-deployment"},"Secrets during Agent Deployment"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," controller triggers on Cluster creation/update events and deploys the agent."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"This image shows how the API server URL and CA propagates through the secrets during registration:")),(0,a.yg)("p",null,"The arrows in the diagram show how the API server values are copied from\nthe Helm values to the cluster registration secret on the upstream\ncluster and finally downstream to the bootstrap secret of the agent."),(0,a.yg)("p",null,'There is one special case, if the agent is for the local/"bootstrap"\ncluster, the server values also exist in the kubeconfig secret,\nreferenced by the Cluster resource. In this case the kubeconfig secret\ncontains the upstream server URL and CA, next to the downstream\'s\nkubeconfig. If the settings are present in the kubeconfig secret, they\noverride the configured values.'),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})),(0,a.yg)("h2",{id:"fleet-cluster-registration-in-rancher"},"Fleet Cluster Registration in Rancher"),(0,a.yg)("p",null,"Rancher installs the fleet helm chart. The API server URL and CA are ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/release/v2.9/pkg/controllers/dashboard/fleetcharts/controller.go#L111-L112"},"derived from Rancher's settings"),"."),(0,a.yg)("p",null,"Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller."),(0,a.yg)("h3",{id:"import-cluster-into-rancher"},"Import Cluster into Rancher"),(0,a.yg)("p",null,"When the user runs ",(0,a.yg)("inlineCode",{parentName:"p"},"curl | kubectl apply"),", the applied manifest includes the rancher agent deployment."),(0,a.yg)("p",null,"The deployment contains a secret ",(0,a.yg)("inlineCode",{parentName:"p"},"cattle-credentials-")," which contains the API URL and a token."),(0,a.yg)("p",null,"The Rancher agent starts up and reports downstream's kubeconfig to upstream."),(0,a.yg)("p",null,"Rancher then creates the fleet Cluster resource, which references a ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/871b6d9137246bd93733f01184ea435f40c5d56c/pkg/provisioningv2/kubeconfig/manager.go#L69"},"kubeconfig secret"),"."),(0,a.yg)("p",null,"\ud83d\udc49Fleet will use this kubeconfig to deploy the agent on the downstream cluster."))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"}}]); \ No newline at end of file diff --git a/assets/js/9e8ad6e8.fa0bea58.js b/assets/js/9e8ad6e8.fa0bea58.js deleted file mode 100644 index 019b9a9d4..000000000 --- a/assets/js/9e8ad6e8.fa0bea58.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8529],{5680:(e,t,r)=>{r.d(t,{xA:()=>g,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},g=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,s=e.originalType,l=e.parentName,g=o(e,["components","mdxType","originalType","parentName"]),u=c(r),h=a,d=u["".concat(l,".").concat(h)]||u[h]||p[h]||s;return r?n.createElement(d,i(i({ref:t},g),{},{components:r})):n.createElement(d,i({ref:t},g))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=r.length,i=new Array(s);i[0]=h;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[u]="string"==typeof e?e:a,i[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const s={},i="Cluster Registration Internals",o={unversionedId:"ref-registration",id:"version-0.10/ref-registration",title:"Cluster Registration Internals",description:"How does cluster registration work?",source:"@site/versioned_docs/version-0.10/ref-registration.md",sourceDirName:".",slug:"/ref-registration",permalink:"/0.10/ref-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-registration.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Resources List",permalink:"/0.10/resource-counts-and-resources-list"},next:{title:"Configuration",permalink:"/0.10/ref-configuration"}},l={},c=[{value:"How does cluster registration work?",id:"how-does-cluster-registration-work",level:2},{value:"Cluster first",id:"cluster-first",level:3},{value:"Creating the Bootstrap Secret for the Downstream Cluster",id:"creating-the-bootstrap-secret-for-the-downstream-cluster",level:3},{value:"Creating the Fleet Agent Deployment",id:"creating-the-fleet-agent-deployment",level:3},{value:"Fleet Agent Starts Registration, Upgrades to Request Account",id:"fleet-agent-starts-registration-upgrades-to-request-account",level:3},{value:"Fleet Agent is Registered, Watches for BundleDeployments",id:"fleet-agent-is-registered-watches-for-bundledeployments",level:3},{value:"Notes",id:"notes",level:3},{value:"Diagram",id:"diagram",level:2},{value:"Registration Process and Controllers",id:"registration-process-and-controllers",level:3},{value:"Secrets during Agent Deployment",id:"secrets-during-agent-deployment",level:3},{value:"Fleet Cluster Registration in Rancher",id:"fleet-cluster-registration-in-rancher",level:2},{value:"Import Cluster into Rancher",id:"import-cluster-into-rancher",level:3}],g={toc:c},u="wrapper";function p(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,n.A)({},g,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-registration-internals"},"Cluster Registration Internals"),(0,a.yg)("h2",{id:"how-does-cluster-registration-work"},"How does cluster registration work?"),(0,a.yg)("p",null,"This text describes cluster registration with more technical details. The text ignores agent initiated registration, as it\u2019s not commonly used.\n",(0,a.yg)("a",{parentName:"p",href:"/0.10/cluster-registration#agent-initiated"},"Agent initiated registration")," is ",(0,a.yg)("a",{parentName:"p",href:"/0.10/cluster-registration#create-cluster-registration-tokens"},'"',(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken"),' first"'),", which means pre-creating a cluster is optional."),(0,a.yg)("p",null,'See "',(0,a.yg)("a",{parentName:"p",href:"/0.10/cluster-registration"},"Register Downstream Clusters"),'" to learn how to register clusters.'),(0,a.yg)("h3",{id:"cluster-first"},"Cluster first"),(0,a.yg)("p",null,(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller"),' starts up and may "bootstrap" the local cluster resource. In Rancher creating the local cluster resource is handled by the fleetcluster controller instead, but otherwise the process is identical.'),(0,a.yg)("p",null,"The process is identical for the local cluster or any downstream cluster. It starts by creating a cluster resource, which refers to a kubeconfig secret."),(0,a.yg)("h3",{id:"creating-the-bootstrap-secret-for-the-downstream-cluster"},"Creating the Bootstrap Secret for the Downstream Cluster"),(0,a.yg)("p",null,"In this step a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' and an "import" service account are created based on a ',(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("p",null,"The Fleet controller creates a ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/architecture#security"},(0,a.yg)("inlineCode",{parentName:"a"},"ClusterRegistrationToken")),"\nand waits for it to be complete. The ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken"),' triggers the creation of the "import" service account, which can create\n',(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistrations"),' and read any secret in the system registration namespace (eg "cattle-fleet-clusters-system"). The ',(0,a.yg)("inlineCode",{parentName:"p"},"import.go"),' controller will\nenqueue itself until the "import" service account exists, because that account is needed to create the ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap")," secret."),(0,a.yg)("h3",{id:"creating-the-fleet-agent-deployment"},"Creating the Fleet Agent Deployment"),(0,a.yg)("p",null,"The Fleet controller will now create the Fleet agent deployment and the bootstrap secret on the downstream cluster."),(0,a.yg)("p",null,"The bootstrap secret contains the API server URL of the upstream cluster and is used to build a kubeconfig to access the upstream cluster. Both values are taken from the Fleet controller config configmap. That configmap is part of the helm chart."),(0,a.yg)("h3",{id:"fleet-agent-starts-registration-upgrades-to-request-account"},"Fleet Agent Starts Registration, Upgrades to Request Account"),(0,a.yg)("p",null,'The agent uses the "import" account to upgrade to a request account.'),(0,a.yg)("p",null,"Immediately the Fleet agent checks for a ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent-bootstrap"),' secret. If the bootstrap secret, which contains the "import" kubeconfig, is present the agent starts registering.'),(0,a.yg)("p",null,"Then agent creates the final ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," resource in fleet-default on the management cluster, with a random number. The random number will be used for the registration secret's name."),(0,a.yg)("p",null,"The Fleet controller triggers and tries to grant the ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterRegistration")," request to create agent's service account and create the 'c-","*","' registration secret with the client's new kubeconfig. The registration secret name is ",(0,a.yg)("inlineCode",{parentName:"p"},'hash("clientID-clientRandom")'),"."),(0,a.yg)("p",null,'The new kubeconfig uses the "request" account. The "request" account can access the cluster status, ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"Contents"),"."),(0,a.yg)("h3",{id:"fleet-agent-is-registered-watches-for-bundledeployments"},"Fleet Agent is Registered, Watches for ",(0,a.yg)("inlineCode",{parentName:"h3"},"BundleDeployments")),(0,a.yg)("p",null,'At this point the agent is fully registered and will persist the "request" account into a ',(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," secret.\nThe API server URL and CA are copied from the bootstrap secret, which inherited these values from the Fleet controller's helm chart values."),(0,a.yg)("p",null,"The bootstrap secret is deleted. When the agent restarts, it will not re-register, since the bootstrap secret is missing."),(0,a.yg)("p",null,'The agent starts watching its "',(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces#cluster-namespaces"},"Cluster Namespace"),'" for ',(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),". At this point the agent is ready to deploy workloads."),(0,a.yg)("h3",{id:"notes"},"Notes"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'The registration starts with the "import" account and pivots to the "request" account.'),(0,a.yg)("li",{parentName:"ul"},'The fleet-default namespace has all the cluster registrations, the "import" account uses a separate namespace.'),(0,a.yg)("li",{parentName:"ul"},"Once the agent is registered, ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will trigger on a cluster or namespace change. The ",(0,a.yg)("inlineCode",{parentName:"li"},"manageagent"),' controller will then create a bundle to adopt the existing agent deployment. The agent will update itself to the bundle and since the "generation" environment variable changes, it will restart.'),(0,a.yg)("li",{parentName:"ul"},"If no bootstrap secret exists, the agent will not re-register.")),(0,a.yg)("h2",{id:"diagram"},"Diagram"),(0,a.yg)("h3",{id:"registration-process-and-controllers"},"Registration Process and Controllers"),(0,a.yg)("p",null,"Detailed analysis of the registration process for clusters. This shows the interaction of controllers, resources and service accounts during the registration of a new downstream cluster or the local cluster."),(0,a.yg)("p",null,"It is important to note that there are multiple ways to start this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Creating a bootstrap config. Fleet does this for the local agent."),(0,a.yg)("li",{parentName:"ul"},"Creating a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource with a kubeconfig. Rancher does this for downstream clusters. See ",(0,a.yg)("a",{parentName:"li",href:"/0.10/cluster-registration#manager-initiated"},"manager-initiated registration"),"."),(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"ClusterRegistrationToken")," resource, optionally create a ",(0,a.yg)("inlineCode",{parentName:"li"},"Cluster")," resource for a pre-defined (",(0,a.yg)("inlineCode",{parentName:"li"},"clientID"),") cluster. See ",(0,a.yg)("a",{parentName:"li",href:"/0.10/cluster-registration#agent-initiated"},"agent-initiated registration"),".")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration",src:r(1319).A,width:"3700",height:"2492"})),(0,a.yg)("h3",{id:"secrets-during-agent-deployment"},"Secrets during Agent Deployment"),(0,a.yg)("p",null,"This diagram shows the resources created during registration and focuses on the k8s API server configuration."),(0,a.yg)("p",null,"The ",(0,a.yg)("inlineCode",{parentName:"p"},"import.go")," controller triggers on Cluster creation/update events and deploys the agent."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"This image shows how the API server URL and CA propagates through the secrets during registration:")),(0,a.yg)("p",null,"The arrows in the diagram show how the API server values are copied from\nthe Helm values to the cluster registration secret on the upstream\ncluster and finally downstream to the bootstrap secret of the agent."),(0,a.yg)("p",null,'There is one special case, if the agent is for the local/"bootstrap"\ncluster, the server values also exist in the kubeconfig secret,\nreferenced by the Cluster resource. In this case the kubeconfig secret\ncontains the upstream server URL and CA, next to the downstream\'s\nkubeconfig. If the settings are present in the kubeconfig secret, they\noverride the configured values.'),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Registration Secrets",src:r(8186).A,width:"1581",height:"4162"})),(0,a.yg)("h2",{id:"fleet-cluster-registration-in-rancher"},"Fleet Cluster Registration in Rancher"),(0,a.yg)("p",null,"Rancher installs the fleet helm chart. The API server URL and CA are ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/release/v2.9/pkg/controllers/dashboard/fleetcharts/controller.go#L111-L112"},"derived from Rancher's settings"),"."),(0,a.yg)("p",null,"Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller."),(0,a.yg)("h3",{id:"import-cluster-into-rancher"},"Import Cluster into Rancher"),(0,a.yg)("p",null,"When the user runs ",(0,a.yg)("inlineCode",{parentName:"p"},"curl | kubectl apply"),", the applied manifest includes the rancher agent deployment."),(0,a.yg)("p",null,"The deployment contains a secret ",(0,a.yg)("inlineCode",{parentName:"p"},"cattle-credentials-")," which contains the API URL and a token."),(0,a.yg)("p",null,"The Rancher agent starts up and reports downstream's kubeconfig to upstream."),(0,a.yg)("p",null,"Rancher then creates the fleet Cluster resource, which references a ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/871b6d9137246bd93733f01184ea435f40c5d56c/pkg/provisioningv2/kubeconfig/manager.go#L69"},"kubeconfig secret"),"."),(0,a.yg)("p",null,"\ud83d\udc49Fleet will use this kubeconfig to deploy the agent on the downstream cluster."))}p.isMDXComponent=!0},1319:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistration-e49565723b02880b6dd7fa0ddc1fdbe2.svg"},8186:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetRegistrationSecrets-deae20b127f82ebcf32a5c593b53b912.svg"}}]); \ No newline at end of file diff --git a/assets/js/9fc6df8f.0b3f329e.js b/assets/js/9fc6df8f.0b3f329e.js deleted file mode 100644 index 8bf5ead5d..000000000 --- a/assets/js/9fc6df8f.0b3f329e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4021],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},432:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.9/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.9/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.9/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/tut-deployment.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.9/quickstart"},next:{title:"Uninstall",permalink:"/0.9/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.9/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},7458:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.7/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.7/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.7/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/tut-deployment.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.7/quickstart"},next:{title:"Uninstall",permalink:"/0.7/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.7/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},432:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"version-0.9/tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/versioned_docs/version-0.9/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/0.9/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/tut-deployment.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/0.9/quickstart"},next:{title:"Uninstall",permalink:"/0.9/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/0.9/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{t.d(n,{xA:()=>d,yg:()=>y});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},d=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},c=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(t),c=r,y=m["".concat(s,".").concat(c)]||m[c]||u[c]||l;return t?a.createElement(y,i(i({ref:n},d),{},{components:t})):a.createElement(y,i({ref:n},d))}));function y(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=c;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[m]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=t(8168),r=(t(6540),t(5680));const l={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/docs/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/gitrepo-content.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:2}],d={toc:p},m="wrapper";function u(e){let{components:n,...t}=e;return(0,r.yg)(m,(0,a.A)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,r.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,r.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,r.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,r.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,r.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,r.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,r.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,r.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,r.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,r.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,r.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,r.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")),(0,r.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,r.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,r.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,r.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,r.yg)("li",{parentName:"ul"},"Multiple ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,r.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,r.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,r.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Double asterisks (",(0,r.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,r.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,r.yg)("inlineCode",{parentName:"li"},"!"))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("admonition",{title:"Credentials in Values",type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If the chart generates certificates or passwords in its templates, these values must be overriden. Otherwise the chart could be continuously deployed as these values change."),(0,r.yg)("p",{parentName:"admonition"},"Credentials loaded from the downstream cluster with ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," are by default encrypted at rest, when ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/"},"data encryption")," is enabled in Kubernetes. Credentials contained in the default ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file, or defined via ",(0,r.yg)("inlineCode",{parentName:"p"},"values:")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," are not, as they are loaded from the repository when the bundle is created."),(0,r.yg)("p",{parentName:"admonition"},"Hardened clusters should add the Fleet CRDs to the ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-add#storing-credentials-in-git"},"list of resources encrypted at rest"),", on the upstream cluster, when storing credentials in the bundles.")),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,r.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/ref-status-fields"},"Cluster and Bundle state"),"."),(0,r.yg)("h2",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,r.yg)("p",null,"Nested ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo CRs")," (defining a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," that points to a repository containing one or more ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources) is supported.\nYou can use this feature to take advantage of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitOps")," in your ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources or, for example, to split complex scenarios into more than one ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource.\nWhen finding a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," in a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Fleet will simply deploy it as any other resource."),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/multi-gitrepo"},"this example"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a06c6d5b.98baaf3e.js b/assets/js/a06c6d5b.98baaf3e.js new file mode 100644 index 000000000..e8cc12f78 --- /dev/null +++ b/assets/js/a06c6d5b.98baaf3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[682],{5680:(e,n,t)=>{t.d(n,{xA:()=>d,yg:()=>y});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},d=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},c=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(t),c=r,y=m["".concat(s,".").concat(c)]||m[c]||u[c]||l;return t?a.createElement(y,i(i({ref:n},d),{},{components:t})):a.createElement(y,i({ref:n},d))}));function y(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=c;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[m]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var a=t(8168),r=(t(6540),t(5680));const l={},i="Git Repository Contents",o={unversionedId:"gitrepo-content",id:"gitrepo-content",title:"Git Repository Contents",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/docs/gitrepo-content.md",sourceDirName:".",slug:"/gitrepo-content",permalink:"/gitrepo-content",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/gitrepo-content.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Lifecycle",permalink:"/ref-bundle-stages"},next:{title:"Namespaces",permalink:"/namespaces"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"Excluding files and directories from bundles",id:"excluding-files-and-directories-from-bundles",level:3},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Using Helm Values",id:"using-helm-values",level:2},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle State",id:"cluster-and-bundle-state",level:2},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:2}],d={toc:p},m="wrapper";function u(e){let{components:n,...t}=e;return(0,r.yg)(m,(0,a.A)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"git-repository-contents"},"Git Repository Contents"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h3",{id:"excluding-files-and-directories-from-bundles"},"Excluding files and directories from bundles"),(0,r.yg)("p",null,"Fleet supports file and directory exclusion by means of ",(0,r.yg)("inlineCode",{parentName:"p"},".fleetignore")," files, in a similar fashion to how ",(0,r.yg)("inlineCode",{parentName:"p"},".gitignore"),"\nfiles behave in git repositories:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Glob syntax is used to match files or directories, using Golang's\n",(0,r.yg)("a",{parentName:"li",href:"https://pkg.go.dev/path/filepath#Match"},(0,r.yg)("inlineCode",{parentName:"a"},"filepath.Match"))),(0,r.yg)("li",{parentName:"ul"},"Empty lines are skipped, and can therefore be used to improve readability"),(0,r.yg)("li",{parentName:"ul"},"Characters like white spaces and ",(0,r.yg)("inlineCode",{parentName:"li"},"#")," can be escaped with a backslash"),(0,r.yg)("li",{parentName:"ul"},"Trailing spaces are ignored, unless escaped"),(0,r.yg)("li",{parentName:"ul"},"Comments, ie lines starting with unescaped ",(0,r.yg)("inlineCode",{parentName:"li"},"#"),", are skipped"),(0,r.yg)("li",{parentName:"ul"},"A given line can match a file or a directory, even if no separator is provided: eg. ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir/*")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," are both\nvalid ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lines, and ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")," matches both files and directories called ",(0,r.yg)("inlineCode",{parentName:"li"},"subdir")),(0,r.yg)("li",{parentName:"ul"},"A match may be found for a file or directory at any level below the directory where a ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," lives, ie\n",(0,r.yg)("inlineCode",{parentName:"li"},"foo.yaml")," will match ",(0,r.yg)("inlineCode",{parentName:"li"},"./foo.yaml")," as well as ",(0,r.yg)("inlineCode",{parentName:"li"},"./path/to/foo.yaml")),(0,r.yg)("li",{parentName:"ul"},"Multiple ",(0,r.yg)("inlineCode",{parentName:"li"},".fleetignore")," files are supported. For instance, in the following directory structure, only\n",(0,r.yg)("inlineCode",{parentName:"li"},"root/something.yaml"),", ",(0,r.yg)("inlineCode",{parentName:"li"},"bar/something2.yaml")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"foo/something.yaml")," will end up in a bundle:")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"root/\n\u251c\u2500\u2500 .fleetignore # contains `ignore-always.yaml'\n\u251c\u2500\u2500 something.yaml\n\u251c\u2500\u2500 bar\n\u2502\xa0\xa0 \u251c\u2500\u2500 .fleetignore # contains `something.yaml`\n\u2502\xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n\u2502\xa0\xa0 \u251c\u2500\u2500 something2.yaml\n\u2502\xa0\xa0 \u2514\u2500\u2500 something.yaml\n\u2514\u2500\u2500 foo\n \xa0\xa0 \u251c\u2500\u2500 ignore-always.yaml\n \xa0\xa0 \u2514\u2500\u2500 something.yaml\n")),(0,r.yg)("p",null,"This currently comes with a few limitations, the following not being supported:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Double asterisks (",(0,r.yg)("inlineCode",{parentName:"li"},"**"),")"),(0,r.yg)("li",{parentName:"ul"},"Explicit inclusions with ",(0,r.yg)("inlineCode",{parentName:"li"},"!"))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("p",null,"The available fields are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/ref-fleet-yaml"},"fleet.yaml reference")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"/gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h2",{id:"using-helm-values"},"Using Helm Values"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),". That means ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," will take precedence over both, ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"values"),"."))),(0,r.yg)("admonition",{title:"Credentials in Values",type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If the chart generates certificates or passwords in its templates, these values must be overriden. Otherwise the chart could be continuously deployed as these values change."),(0,r.yg)("p",{parentName:"admonition"},"Credentials loaded from the downstream cluster with ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom")," are by default encrypted at rest, when ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/"},"data encryption")," is enabled in Kubernetes. Credentials contained in the default ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file, or defined via ",(0,r.yg)("inlineCode",{parentName:"p"},"values:")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFiles")," are not, as they are loaded from the repository when the bundle is created."),(0,r.yg)("p",{parentName:"admonition"},"Hardened clusters should add the Fleet CRDs to the ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-add#storing-credentials-in-git"},"list of resources encrypted at rest"),", on the upstream cluster, when storing credentials in the bundles.")),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in ",(0,r.yg)("em",{parentName:"p"},"downstream clusters"),"."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 3\n serviceType: NodePort\n")),(0,r.yg)("p",null,"A secret like that, can be created from a YAML file ",(0,r.yg)("inlineCode",{parentName:"p"},"secretdata.yaml")," by running the following kubectl command: ",(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret generic secret-values --from-file=values.yaml=secretdata.yaml")),(0,r.yg)("p",null,"The resources can then be referenced from a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'helm:\n chart: simple-chart\n valuesFrom:\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n - configMapKeyRef:\n name: configmap-values\n namespace: default\n key: values.yaml\n values:\n replicas: "4"\n')),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: all\n # Match everything\n clusterSelector: {}\n- name: none\n # Selector ignored\n clusterSelector: null\n")),(0,r.yg)("p",null,"When matching a cluster by name, make sure to use the name of the\n",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource. The Rancher UI also has a provisioning and\na management cluster resource. Since the management cluster resource is not\nnamespaced, its name is different and contains a random suffix."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targetCustomizations:\n- name: prod\n clusterName: fleetname\n")),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-targets#customization-per-cluster"},"Mapping to Downstream Clusters")," for more information and a list of supported customizations."),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file will be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents of a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/ref-status-fields"},"Cluster and Bundle state"),"."),(0,r.yg)("h2",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,r.yg)("p",null,"Nested ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo CRs")," (defining a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," that points to a repository containing one or more ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources) is supported.\nYou can use this feature to take advantage of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitOps")," in your ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resources or, for example, to split complex scenarios into more than one ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource.\nWhen finding a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," in a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Fleet will simply deploy it as any other resource."),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/multi-gitrepo"},"this example"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a2c468b1.961a67d7.js b/assets/js/a2c468b1.961a67d7.js new file mode 100644 index 000000000..d9b179288 --- /dev/null +++ b/assets/js/a2c468b1.961a67d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8586],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs for Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.4/bundle-diffs",title:"Generating Diffs for Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.4/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.4/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/bundle-diffs.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.4/gitrepo-targets"},next:{title:"Webhook",permalink:"/0.4/webhook"}},l={},p=[{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-for-modified-gitrepos"},"Generating Diffs for Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec. "),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")," "),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/a2c468b1.ee780342.js b/assets/js/a2c468b1.ee780342.js deleted file mode 100644 index 5635b21be..000000000 --- a/assets/js/a2c468b1.ee780342.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8586],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs for Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.4/bundle-diffs",title:"Generating Diffs for Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.4/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.4/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/bundle-diffs.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.4/gitrepo-targets"},next:{title:"Webhook",permalink:"/0.4/webhook"}},l={},p=[{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-for-modified-gitrepos"},"Generating Diffs for Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec. "),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")," "),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/a60f0c4b.ef4e89c8.js b/assets/js/a60f0c4b.6b2d4b69.js similarity index 54% rename from assets/js/a60f0c4b.ef4e89c8.js rename to assets/js/a60f0c4b.6b2d4b69.js index bde6c1f5d..24a061009 100644 --- a/assets/js/a60f0c4b.ef4e89c8.js +++ b/assets/js/a60f0c4b.6b2d4b69.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4129],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.7/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.7/index.md",sourceDirName:".",slug:"/",permalink:"/0.7/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/index.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.7/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4129],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.7/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.7/index.md",sourceDirName:".",slug:"/",permalink:"/0.7/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/index.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.7/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file diff --git a/assets/js/a8ca5d11.4cbcaf70.js b/assets/js/a8ca5d11.4cbcaf70.js deleted file mode 100644 index 82daaad92..000000000 --- a/assets/js/a8ca5d11.4cbcaf70.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3813],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.8/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.8/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.8/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/gitrepo-add.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.8/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.8/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],d={toc:s},c="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.8/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.8/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.8/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.8/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.8/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.8/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a8ca5d11.c6a3fb64.js b/assets/js/a8ca5d11.c6a3fb64.js new file mode 100644 index 000000000..ace00bc60 --- /dev/null +++ b/assets/js/a8ca5d11.c6a3fb64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3813],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),c=s(a),m=r,h=c["".concat(p,".").concat(m)]||c[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},d),{},{components:a})):n.createElement(h,l({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.8/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.8/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.8/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/gitrepo-add.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.8/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.8/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],d={toc:s},c="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(c,(0,n.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.8/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.8/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.8/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h2",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.8/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.8/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add it any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using openssh format for the private key and you are creating it in the UI, make sure a carriage return is appended in the end of the private key.")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.8/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a947fe06.a3a8aac7.js b/assets/js/a947fe06.7523aae4.js similarity index 61% rename from assets/js/a947fe06.a3a8aac7.js rename to assets/js/a947fe06.7523aae4.js index 8843670c9..142b30564 100644 --- a/assets/js/a947fe06.a3a8aac7.js +++ b/assets/js/a947fe06.7523aae4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6511],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,i(i({ref:t},p),{},{components:n})):r.createElement(g,i({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,i=new Array(a);i[0]=d;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[s]="string"==typeof e?e:l,i[1]=o;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},i=void 0,o={unversionedId:"cli/fleet-cli/fleet",id:"version-0.9/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.9/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.9/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.9/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_cleanup"},"fleet cleanup"),"\t - Clean up outdated cluster registrations"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6511],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),f=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=f(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),s=f(n),d=l,g=s["".concat(c,".").concat(d)]||s[d]||u[d]||a;return n?r.createElement(g,i(i({ref:t},p),{},{components:n})):r.createElement(g,i({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,i=new Array(a);i[0]=d;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[s]="string"==typeof e?e:l,i[1]=o;for(var f=2;f{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>f});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet"},i=void 0,o={unversionedId:"cli/fleet-cli/fleet",id:"version-0.9/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.9/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.9/cli/fleet-agent/"},next:{title:"fleet apply",permalink:"/0.9/cli/fleet-cli/fleet_apply"}},c={},f=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:f},s="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(s,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet"},"fleet"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for fleet\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_cleanup"},"fleet cleanup"),"\t - Clean up outdated cluster registrations"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet_test"},"fleet test"),"\t - Match a bundle to a target and render the output")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a9e7f6cd.41b56d6d.js b/assets/js/a9e7f6cd.9ee6e728.js similarity index 70% rename from assets/js/a9e7f6cd.41b56d6d.js rename to assets/js/a9e7f6cd.9ee6e728.js index 77e00a543..f7b64c2c5 100644 --- a/assets/js/a9e7f6cd.41b56d6d.js +++ b/assets/js/a9e7f6cd.9ee6e728.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2772],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,m=p["".concat(s,".").concat(d)]||p[d]||f[d]||i;return n?r.createElement(m,l(l({ref:t},u),{},{components:n})):r.createElement(m,l({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>f,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const i={},l="Installation",o={unversionedId:"installation",id:"version-0.4/installation",title:"Installation",description:"The installation is broken up into two different use cases: Single and",source:"@site/versioned_docs/version-0.4/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.4/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/installation.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Advanced Users",permalink:"/0.4/advanced-users"},next:{title:"Single Cluster Install",permalink:"/0.4/single-cluster-install"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"installation"},"Installation"),(0,a.yg)("p",null,"The installation is broken up into two different use cases: ",(0,a.yg)("a",{parentName:"p",href:"/0.4/single-cluster-install"},"Single")," and\n",(0,a.yg)("a",{parentName:"p",href:"/0.4/multi-cluster-install"},"Multi-Cluster")," install. The single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,a.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2772],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,m=p["".concat(s,".").concat(d)]||p[d]||f[d]||i;return n?r.createElement(m,l(l({ref:t},u),{},{components:n})):r.createElement(m,l({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>f,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const i={},l="Installation",o={unversionedId:"installation",id:"version-0.4/installation",title:"Installation",description:"The installation is broken up into two different use cases: Single and",source:"@site/versioned_docs/version-0.4/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.4/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/installation.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Advanced Users",permalink:"/0.4/advanced-users"},next:{title:"Single Cluster Install",permalink:"/0.4/single-cluster-install"}},s={},c=[],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"installation"},"Installation"),(0,a.yg)("p",null,"The installation is broken up into two different use cases: ",(0,a.yg)("a",{parentName:"p",href:"/0.4/single-cluster-install"},"Single")," and\n",(0,a.yg)("a",{parentName:"p",href:"/0.4/multi-cluster-install"},"Multi-Cluster")," install. The single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,a.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ab0c1f88.71ba563b.js b/assets/js/ab0c1f88.1110ee63.js similarity index 77% rename from assets/js/ab0c1f88.71ba563b.js rename to assets/js/ab0c1f88.1110ee63.js index 90da39a8b..ea21ec399 100644 --- a/assets/js/ab0c1f88.71ba563b.js +++ b/assets/js/ab0c1f88.1110ee63.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2388],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,i=new Array(s);i[0]=m;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},i="Custom Resources During Deployment",a={unversionedId:"resources-during-deployment",id:"version-0.8/resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.8/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/0.8/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/resources-during-deployment.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.8/namespaces"},next:{title:"Installation Details",permalink:"/0.8/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2388],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,i=new Array(s);i[0]=m;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},i="Custom Resources During Deployment",a={unversionedId:"resources-during-deployment",id:"version-0.8/resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.8/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/0.8/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/resources-during-deployment.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.8/namespaces"},next:{title:"Installation Details",permalink:"/0.8/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file diff --git a/assets/js/ab0ef0e3.57658d16.js b/assets/js/ab0ef0e3.f60d5079.js similarity index 51% rename from assets/js/ab0ef0e3.57658d16.js rename to assets/js/ab0ef0e3.f60d5079.js index 76ba4073c..4668f2814 100644 --- a/assets/js/ab0ef0e3.57658d16.js +++ b/assets/js/ab0ef0e3.f60d5079.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2805],{5680:(e,t,r)=>{r.d(t,{xA:()=>s,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),f=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=f(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=f(r),d=l,g=p["".concat(i,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},s),{},{components:r})):n.createElement(g,a({ref:t},s))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:l,a[1]=c;for(var f=2;f{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>f});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller",id:"cli/fleet-controller/fleetcontroller",title:"",description:"fleetcontroller",source:"@site/docs/cli/fleet-controller/fleetcontroller.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller",permalink:"/cli/fleet-controller/fleetcontroller",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller"},sidebar:"docs",previous:{title:"fleet test",permalink:"/cli/fleet-cli/fleet_test"},next:{title:"fleetcontroller agentmanagement",permalink:"/cli/fleet-controller/fleetcontroller_agentmanagement"}},i={},f=[{value:"fleetcontroller",id:"fleetcontroller",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:f},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller"},"fleetcontroller"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-metrics disable metrics\n -h, --help help for fleetcontroller\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string namespace to watch (default \"cattle-fleet-system\")\n --shard-id string only manage resources labeled with a specific shard ID\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_agentmanagement"},"fleetcontroller agentmanagement"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_cleanup"},"fleetcontroller cleanup"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_gitjob"},"fleetcontroller gitjob"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2805],{5680:(e,t,r)=>{r.d(t,{xA:()=>s,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),f=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},s=function(e){var t=f(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=f(r),d=l,g=p["".concat(i,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},s),{},{components:r})):n.createElement(g,a({ref:t},s))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:l,a[1]=c;for(var f=2;f{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>f});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller",id:"cli/fleet-controller/fleetcontroller",title:"",description:"fleetcontroller",source:"@site/docs/cli/fleet-controller/fleetcontroller.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller",permalink:"/cli/fleet-controller/fleetcontroller",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-controller/fleetcontroller.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller"},sidebar:"docs",previous:{title:"fleet test",permalink:"/cli/fleet-cli/fleet_test"},next:{title:"fleetcontroller agentmanagement",permalink:"/cli/fleet-controller/fleetcontroller_agentmanagement"}},i={},f=[{value:"fleetcontroller",id:"fleetcontroller",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:f},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller"},"fleetcontroller"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-metrics disable metrics\n -h, --help help for fleetcontroller\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n --namespace string namespace to watch (default \"cattle-fleet-system\")\n --shard-id string only manage resources labeled with a specific shard ID\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_agentmanagement"},"fleetcontroller agentmanagement"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_cleanup"},"fleetcontroller cleanup"),"\t - "),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller_gitjob"},"fleetcontroller gitjob"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ab68c950.550f2f45.js b/assets/js/ab68c950.550f2f45.js new file mode 100644 index 000000000..732cfb92e --- /dev/null +++ b/assets/js/ab68c950.550f2f45.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4395],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},6595:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.9/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.9/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.9/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/installation.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/0.9/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/0.9/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"First add Fleet's Helm repository."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA.")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/ab68c950.b1678092.js b/assets/js/ab68c950.b1678092.js deleted file mode 100644 index 049840039..000000000 --- a/assets/js/ab68c950.b1678092.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4395],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},6595:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.9/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.9/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.9/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/installation.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources During Deployment",permalink:"/0.9/resources-during-deployment"},next:{title:"Register Downstream Clusters",permalink:"/0.9/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"First add Fleet's Helm repository."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA.")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.9/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.9/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/aba71817.2f7243e2.js b/assets/js/aba71817.2f7243e2.js deleted file mode 100644 index 22fe9fc54..000000000 --- a/assets/js/aba71817.2f7243e2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5321],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=l.createContext({}),s=function(e){var t=l.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=s(e.components);return l.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},f=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=s(n),f=r,m=d["".concat(c,".").concat(f)]||d[f]||u[f]||a;return n?l.createElement(m,o(o({ref:t},p),{},{components:n})):l.createElement(m,o({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,o=new Array(a);o[0]=f;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var l=n(8168),r=(n(6540),n(5680));const a={},o="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/docs/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-bundle-stages.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/concepts"},next:{title:"Git Repository Contents",permalink:"/gitrepo-content"}},c={},s=[{value:"Examining the Bundle Lifecycle With the CLI",id:"examining-the-bundle-lifecycle-with-the-cli",level:2},{value:"fleet apply",id:"fleet-apply",level:3},{value:"fleet target",id:"fleet-target",level:3},{value:"fleet deploy",id:"fleet-deploy",level:3},{value:"Lifecycle CLI Example",id:"lifecycle-cli-example",level:3}],p={toc:s},d="wrapper";function u(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,l.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,r.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,r.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"User will create a ",(0,r.yg)("a",{parentName:"li",href:"/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,r.yg)("a",{parentName:"li",href:"/webhook"},"webhook event"),". With every commit change, the ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,r.yg)("a",{parentName:"li",href:"/ref-status-fields#bundles"},"bundle"),".")),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,r.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,r.yg)("ol",{start:3},(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,r.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,r.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})),(0,r.yg)("h2",{id:"examining-the-bundle-lifecycle-with-the-cli"},"Examining the Bundle Lifecycle With the CLI"),(0,r.yg)("p",null,"Several fleet CLI commands help with debugging bundles."),(0,r.yg)("h3",{id:"fleet-apply"},"fleet apply"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/cli/fleet-cli/fleet_apply"},"Apply")," renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\n")),(0,r.yg)("p",null,"More information on how to create bundles with ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet apply")," can be found in the ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/bundle-add"},"section on bundles"),"."),(0,r.yg)("h3",{id:"fleet-target"},"fleet target"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/cli/fleet-cli/fleet_target"},"Target")," reads a bundle from a file and works with a live cluster to print out the ",(0,r.yg)("inlineCode",{parentName:"p"},"bundledeployment")," & ",(0,r.yg)("inlineCode",{parentName:"p"},"content"),' resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.'),(0,r.yg)("h3",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/cli/fleet-cli/fleet_deploy"},"Deploy")," takes the output of ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet target"),", or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment."),(0,r.yg)("p",null,"The deploy command can be used to bring bundles to air-gapped clusters."),(0,r.yg)("h3",{id:"lifecycle-cli-example"},"Lifecycle CLI Example"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\n# for information about apply see https://fleet.rancher.io/bundle-add\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\nfleet target --bundle-file bundle.yaml --list-inputs > bd.yaml\nfleet deploy --input-file bd.yaml --dry-run\n")))}u.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>l});const l=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/aba71817.6868c433.js b/assets/js/aba71817.6868c433.js new file mode 100644 index 000000000..e39fa7b02 --- /dev/null +++ b/assets/js/aba71817.6868c433.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5321],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=l.createContext({}),s=function(e){var t=l.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=s(e.components);return l.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},f=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=s(n),f=r,m=d["".concat(c,".").concat(f)]||d[f]||u[f]||a;return n?l.createElement(m,o(o({ref:t},p),{},{components:n})):l.createElement(m,o({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,o=new Array(a);o[0]=f;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var l=n(8168),r=(n(6540),n(5680));const a={},o="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/docs/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-bundle-stages.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/concepts"},next:{title:"Git Repository Contents",permalink:"/gitrepo-content"}},c={},s=[{value:"Examining the Bundle Lifecycle With the CLI",id:"examining-the-bundle-lifecycle-with-the-cli",level:2},{value:"fleet apply",id:"fleet-apply",level:3},{value:"fleet target",id:"fleet-target",level:3},{value:"fleet deploy",id:"fleet-deploy",level:3},{value:"Lifecycle CLI Example",id:"lifecycle-cli-example",level:3}],p={toc:s},d="wrapper";function u(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,l.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,r.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,r.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"User will create a ",(0,r.yg)("a",{parentName:"li",href:"/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,r.yg)("a",{parentName:"li",href:"/webhook"},"webhook event"),". With every commit change, the ",(0,r.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,r.yg)("a",{parentName:"li",href:"/ref-status-fields#bundles"},"bundle"),".")),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,r.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,r.yg)("ol",{start:3},(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,r.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,r.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,r.yg)("li",{parentName:"ol"},"The ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,r.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})),(0,r.yg)("h2",{id:"examining-the-bundle-lifecycle-with-the-cli"},"Examining the Bundle Lifecycle With the CLI"),(0,r.yg)("p",null,"Several fleet CLI commands help with debugging bundles."),(0,r.yg)("h3",{id:"fleet-apply"},"fleet apply"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/cli/fleet-cli/fleet_apply"},"Apply")," renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\n")),(0,r.yg)("p",null,"More information on how to create bundles with ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet apply")," can be found in the ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/bundle-add"},"section on bundles"),"."),(0,r.yg)("h3",{id:"fleet-target"},"fleet target"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/cli/fleet-cli/fleet_target"},"Target")," reads a bundle from a file and works with a live cluster to print out the ",(0,r.yg)("inlineCode",{parentName:"p"},"bundledeployment")," & ",(0,r.yg)("inlineCode",{parentName:"p"},"content"),' resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.'),(0,r.yg)("h3",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/cli/fleet-cli/fleet_deploy"},"Deploy")," takes the output of ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet target"),", or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment."),(0,r.yg)("p",null,"The deploy command can be used to bring bundles to air-gapped clusters."),(0,r.yg)("h3",{id:"lifecycle-cli-example"},"Lifecycle CLI Example"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"git clone https://github.com/rancher/fleet-test-data\ncd fleet-test-data\n# for information about apply see https://fleet.rancher.io/bundle-add\nfleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/\nfleet target --bundle-file bundle.yaml --list-inputs > bd.yaml\nfleet deploy --input-file bd.yaml --dry-run\n")))}u.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>l});const l=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/abf95bb4.421c137b.js b/assets/js/abf95bb4.421c137b.js deleted file mode 100644 index f5517e37b..000000000 --- a/assets/js/abf95bb4.421c137b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5790],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.7/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.7/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.7/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cluster-bundles-state.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.7/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.7/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/abf95bb4.c9c848fb.js b/assets/js/abf95bb4.c9c848fb.js new file mode 100644 index 000000000..89ece1389 --- /dev/null +++ b/assets/js/abf95bb4.c9c848fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5790],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.7/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.7/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.7/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cluster-bundles-state.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.7/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.7/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ae10697b.3d8b04dc.js b/assets/js/ae10697b.3d8b04dc.js deleted file mode 100644 index 10a1ad9f6..000000000 --- a/assets/js/ae10697b.3d8b04dc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4786],{5680:(e,a,t)=>{t.d(a,{xA:()=>d,yg:()=>g});var r=t(6540);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function i(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,r)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var n=r.createContext({}),c=function(e){var a=r.useContext(n),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},d=function(e){var a=c(e.components);return r.createElement(n.Provider,{value:a},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var a=e.children;return r.createElement(r.Fragment,{},a)}},p=r.forwardRef((function(e,a){var t=e.components,l=e.mdxType,i=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=c(t),p=l,g=u["".concat(n,".").concat(p)]||u[p]||h[p]||i;return t?r.createElement(g,s(s({ref:a},d),{},{components:t})):r.createElement(g,s({ref:a},d))}));function g(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var i=t.length,s=new Array(i);s[0]=p;var o={};for(var n in a)hasOwnProperty.call(a,n)&&(o[n]=a[n]);o.originalType=e,o[u]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{t.r(a),t.d(a,{assets:()=>n,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=t(8168),l=(t(6540),t(5680));const i={title:"v0.9.1",date:"2024-03-21 16:35:26 +0000 UTC"},s=void 0,o={unversionedId:"changelogs/changelogs/v0.9.1",id:"version-0.9/changelogs/changelogs/v0.9.1",title:"v0.9.1",description:"(rancherio-gh-m) released this 2024-03-21 1626 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.1",permalink:"/0.9/changelogs/changelogs/v0.9.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.1.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.9.1",date:"2024-03-21 16:35:26 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.0",permalink:"/0.9/changelogs/changelogs/v0.9.0"},next:{title:"v0.9.2",permalink:"/0.9/changelogs/changelogs/v0.9.2"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},u="wrapper";function h(e){let{components:a,...t}=e;return(0,l.yg)(u,(0,r.A)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-03-21 16:35:26 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Allow correctDrift to be overridden in target customization by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2019024692","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1982","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1982/hovercard",href:"https://github.com/rancher/fleet/pull/1982"},"#1982")),(0,l.yg)("li",null,"Add azure webhook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2082426538","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/412","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/412/hovercard",href:"https://github.com/rancher/gitjob/pull/412"},"rancher/gitjob#412")),(0,l.yg)("li",null,"Keep CRDs when deleting a Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2047051556","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2024","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2024/hovercard",href:"https://github.com/rancher/fleet/pull/2024"},"#2024")),(0,l.yg)("li",null,"Add security context to token cleanup job by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2161729384","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2192","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2192/hovercard",href:"https://github.com/rancher/fleet/pull/2192"},"#2192"))),(0,l.yg)("h3",null,"Performance"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Use index when listing BundleDeployments by Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006608014","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1954","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1954/hovercard",href:"https://github.com/rancher/fleet/pull/1954"},"#1954")),(0,l.yg)("li",null,"Replace json-based implementation of DeepCopy on GenericMap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006635369","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1955","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1955/hovercard",href:"https://github.com/rancher/fleet/pull/1955"},"#1955")),(0,l.yg)("li",null,"Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078347797","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2061","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2061/hovercard",href:"https://github.com/rancher/fleet/pull/2061"},"#2061")),(0,l.yg)("li",null,"Reduce BundleDeployment triggering on deployed resources updates by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2050943227","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2031","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2031/hovercard",href:"https://github.com/rancher/fleet/pull/2031"},"#2031"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix azure devops git clone error by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2065843069","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/400","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/400/hovercard",href:"https://github.com/rancher/gitjob/pull/400"},"rancher/gitjob#400")),(0,l.yg)("li",null,"Add http proxy env vars to containers and initContainers created by GitJob by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2040105108","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/380","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/380/hovercard",href:"https://github.com/rancher/gitjob/pull/380"},"rancher/gitjob#380")),(0,l.yg)("li",null,"Add support for Azure DevOps Webhook for gitRepos using SSH URL by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2173251497","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/446","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/446/hovercard",href:"https://github.com/rancher/gitjob/pull/446"},"rancher/gitjob#446")),(0,l.yg)("li",null,"Fixes panic when imagescan uses prereleases and * by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2156524867","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2183","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2183/hovercard",href:"https://github.com/rancher/fleet/pull/2183"},"#2183")),(0,l.yg)("li",null,"Fix Existing Namespace Not Found By Label by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2166659192","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2204","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2204/hovercard",href:"https://github.com/rancher/fleet/pull/2204"},"#2204"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump to ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.9.1"},"gitjob chart v0.9.1")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2083745193","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2079","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2079/hovercard",href:"https://github.com/rancher/fleet/pull/2079"},"#2079")),(0,l.yg)("li",null,"OCI test changes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2007660305","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1959","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1959/hovercard",href:"https://github.com/rancher/fleet/pull/1959"},"#1959")),(0,l.yg)("li",null,"OCI auth test changes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2007995262","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1961","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1961/hovercard",href:"https://github.com/rancher/fleet/pull/1961"},"#1961")),(0,l.yg)("li",null,"Remove s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2048174208","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2027","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2027/hovercard",href:"https://github.com/rancher/fleet/pull/2027"},"#2027")),(0,l.yg)("li",null,"Remove s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2041228490","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/381","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/381/hovercard",href:"https://github.com/rancher/gitjob/pull/381"},"rancher/gitjob#381")),(0,l.yg)("li",null,"BCI base version by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078778336","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2064","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2064/hovercard",href:"https://github.com/rancher/fleet/pull/2064"},"#2064")),(0,l.yg)("li",null,"Update CI for k8s 1.29 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2081754311","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2072","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2072/hovercard",href:"https://github.com/rancher/fleet/pull/2072"},"#2072")),(0,l.yg)("li",null,"Bump go git 5.11 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2076908695","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2059","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2059/hovercard",href:"https://github.com/rancher/fleet/pull/2059"},"#2059")),(0,l.yg)("li",null,"Bump go-git module by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2076733191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/406","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/406/hovercard",href:"https://github.com/rancher/gitjob/pull/406"},"rancher/gitjob#406")),(0,l.yg)("li",null,"Bump wrangler/v2 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078819422","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/408","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/408/hovercard",href:"https://github.com/rancher/gitjob/pull/408"},"rancher/gitjob#408"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.0...v0.9.1"},(0,l.yg)("tt",null,"v0.9.0...v0.9.1"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-crd-0.9.1.tgz"},"fleet-crd-0.9.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-agent-0.9.1.tgz"},"fleet-agent-0.9.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-0.9.1.tgz"},"fleet-0.9.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.1"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ae10697b.d29c1773.js b/assets/js/ae10697b.d29c1773.js new file mode 100644 index 000000000..d2bb939ca --- /dev/null +++ b/assets/js/ae10697b.d29c1773.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4786],{5680:(e,a,t)=>{t.d(a,{xA:()=>d,yg:()=>g});var r=t(6540);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function i(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,r)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var n=r.createContext({}),c=function(e){var a=r.useContext(n),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},d=function(e){var a=c(e.components);return r.createElement(n.Provider,{value:a},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var a=e.children;return r.createElement(r.Fragment,{},a)}},p=r.forwardRef((function(e,a){var t=e.components,l=e.mdxType,i=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=c(t),p=l,g=u["".concat(n,".").concat(p)]||u[p]||h[p]||i;return t?r.createElement(g,s(s({ref:a},d),{},{components:t})):r.createElement(g,s({ref:a},d))}));function g(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var i=t.length,s=new Array(i);s[0]=p;var o={};for(var n in a)hasOwnProperty.call(a,n)&&(o[n]=a[n]);o.originalType=e,o[u]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{t.r(a),t.d(a,{assets:()=>n,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=t(8168),l=(t(6540),t(5680));const i={title:"v0.9.1",date:"2024-03-21 16:35:26 +0000 UTC"},s=void 0,o={unversionedId:"changelogs/changelogs/v0.9.1",id:"version-0.9/changelogs/changelogs/v0.9.1",title:"v0.9.1",description:"(rancherio-gh-m) released this 2024-03-21 1626 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.1",permalink:"/0.9/changelogs/changelogs/v0.9.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.1.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.9.1",date:"2024-03-21 16:35:26 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.0",permalink:"/0.9/changelogs/changelogs/v0.9.0"},next:{title:"v0.9.2",permalink:"/0.9/changelogs/changelogs/v0.9.2"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},u="wrapper";function h(e){let{components:a,...t}=e;return(0,l.yg)(u,(0,r.A)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-03-21 16:35:26 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Allow correctDrift to be overridden in target customization by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2019024692","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1982","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1982/hovercard",href:"https://github.com/rancher/fleet/pull/1982"},"#1982")),(0,l.yg)("li",null,"Add azure webhook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2082426538","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/412","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/412/hovercard",href:"https://github.com/rancher/gitjob/pull/412"},"rancher/gitjob#412")),(0,l.yg)("li",null,"Keep CRDs when deleting a Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2047051556","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2024","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2024/hovercard",href:"https://github.com/rancher/fleet/pull/2024"},"#2024")),(0,l.yg)("li",null,"Add security context to token cleanup job by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2161729384","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2192","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2192/hovercard",href:"https://github.com/rancher/fleet/pull/2192"},"#2192"))),(0,l.yg)("h3",null,"Performance"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Use index when listing BundleDeployments by Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006608014","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1954","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1954/hovercard",href:"https://github.com/rancher/fleet/pull/1954"},"#1954")),(0,l.yg)("li",null,"Replace json-based implementation of DeepCopy on GenericMap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006635369","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1955","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1955/hovercard",href:"https://github.com/rancher/fleet/pull/1955"},"#1955")),(0,l.yg)("li",null,"Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078347797","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2061","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2061/hovercard",href:"https://github.com/rancher/fleet/pull/2061"},"#2061")),(0,l.yg)("li",null,"Reduce BundleDeployment triggering on deployed resources updates by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2050943227","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2031","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2031/hovercard",href:"https://github.com/rancher/fleet/pull/2031"},"#2031"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Fix azure devops git clone error by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2065843069","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/400","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/400/hovercard",href:"https://github.com/rancher/gitjob/pull/400"},"rancher/gitjob#400")),(0,l.yg)("li",null,"Add http proxy env vars to containers and initContainers created by GitJob by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2040105108","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/380","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/380/hovercard",href:"https://github.com/rancher/gitjob/pull/380"},"rancher/gitjob#380")),(0,l.yg)("li",null,"Add support for Azure DevOps Webhook for gitRepos using SSH URL by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2173251497","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/446","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/446/hovercard",href:"https://github.com/rancher/gitjob/pull/446"},"rancher/gitjob#446")),(0,l.yg)("li",null,"Fixes panic when imagescan uses prereleases and * by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/0xavi0/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/0xavi0"},"@0xavi0")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2156524867","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2183","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2183/hovercard",href:"https://github.com/rancher/fleet/pull/2183"},"#2183")),(0,l.yg)("li",null,"Fix Existing Namespace Not Found By Label by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2166659192","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2204","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2204/hovercard",href:"https://github.com/rancher/fleet/pull/2204"},"#2204"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump to ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.9.1"},"gitjob chart v0.9.1")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2083745193","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2079","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2079/hovercard",href:"https://github.com/rancher/fleet/pull/2079"},"#2079")),(0,l.yg)("li",null,"OCI test changes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2007660305","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1959","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1959/hovercard",href:"https://github.com/rancher/fleet/pull/1959"},"#1959")),(0,l.yg)("li",null,"OCI auth test changes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2007995262","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1961","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1961/hovercard",href:"https://github.com/rancher/fleet/pull/1961"},"#1961")),(0,l.yg)("li",null,"Remove s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2048174208","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2027","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2027/hovercard",href:"https://github.com/rancher/fleet/pull/2027"},"#2027")),(0,l.yg)("li",null,"Remove s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2041228490","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/381","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/381/hovercard",href:"https://github.com/rancher/gitjob/pull/381"},"rancher/gitjob#381")),(0,l.yg)("li",null,"BCI base version by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078778336","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2064","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2064/hovercard",href:"https://github.com/rancher/fleet/pull/2064"},"#2064")),(0,l.yg)("li",null,"Update CI for k8s 1.29 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2081754311","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2072","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2072/hovercard",href:"https://github.com/rancher/fleet/pull/2072"},"#2072")),(0,l.yg)("li",null,"Bump go git 5.11 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2076908695","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2059","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2059/hovercard",href:"https://github.com/rancher/fleet/pull/2059"},"#2059")),(0,l.yg)("li",null,"Bump go-git module by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2076733191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/406","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/406/hovercard",href:"https://github.com/rancher/gitjob/pull/406"},"rancher/gitjob#406")),(0,l.yg)("li",null,"Bump wrangler/v2 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078819422","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/408","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/408/hovercard",href:"https://github.com/rancher/gitjob/pull/408"},"rancher/gitjob#408"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.0...v0.9.1"},(0,l.yg)("tt",null,"v0.9.0...v0.9.1"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-crd-0.9.1.tgz"},"fleet-crd-0.9.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-agent-0.9.1.tgz"},"fleet-agent-0.9.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-0.9.1.tgz"},"fleet-0.9.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.1/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.1"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ae2335f3.237ea590.js b/assets/js/ae2335f3.237ea590.js deleted file mode 100644 index 67a112efd..000000000 --- a/assets/js/ae2335f3.237ea590.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3333],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},860:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/docs/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cluster-registration.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/installation"},next:{title:"Create Cluster Groups",permalink:"/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://:6443\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"If the API server is not listening on the https port (443), the ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_URL")," should include the port, e.g. ",(0,r.yg)("inlineCode",{parentName:"p"},"https://:6443"),". The URL can be found in the ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file.\nValue in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ae2335f3.68b540ee.js b/assets/js/ae2335f3.68b540ee.js new file mode 100644 index 000000000..ea3500847 --- /dev/null +++ b/assets/js/ae2335f3.68b540ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3333],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},860:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/docs/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cluster-registration.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/installation"},next:{title:"Create Cluster Groups",permalink:"/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://:6443\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"If the API server is not listening on the https port (443), the ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_URL")," should include the port, e.g. ",(0,r.yg)("inlineCode",{parentName:"p"},"https://:6443"),". The URL can be found in the ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file.\nValue in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/aee07340.255d18c6.js b/assets/js/aee07340.255d18c6.js new file mode 100644 index 000000000..3ae0e5856 --- /dev/null +++ b/assets/js/aee07340.255d18c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3236],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.7/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.7/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.7/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/gitrepo-targets.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.7/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.7/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/aee07340.91e2c758.js b/assets/js/aee07340.91e2c758.js deleted file mode 100644 index 0a18b25b9..000000000 --- a/assets/js/aee07340.91e2c758.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3236],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"version-0.7/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/versioned_docs/version-0.7/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.7/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/gitrepo-targets.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/0.7/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.7/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/af10d9fb.5cc8409a.js b/assets/js/af10d9fb.5cc8409a.js deleted file mode 100644 index 62aece05f..000000000 --- a/assets/js/af10d9fb.5cc8409a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8992],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=s(r),d=l,g=f["".concat(c,".").concat(d)]||f[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},p),{},{components:r})):n.createElement(g,a({ref:t},p))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/docs/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_apply.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/cli/fleet-cli/fleet"},next:{title:"fleet cleanup",permalink:"/cli/fleet-cli/fleet_cleanup"}},c={},s=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:s},f="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Create bundles from directories, and output them or apply them on a cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --context string kubeconfig context for authentication\n --correct-drift Rollback any change made from outside of Fleet\n --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated\n --correct-drift-keep-fail-history Keep helm history for failed rollbacks\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n --helm-credentials-by-path-file string Path of file containing helm credentials for paths\n --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided\n -h, --help help for apply\n --keep-resources Keep resources created after the GitRepo or Bundle is deleted\n -k, --kubeconfig string kubeconfig for authentication\n -l, --label strings Labels to apply to created bundles\n -n, --namespace string namespace (default "fleet-local")\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/af10d9fb.a22cf0dc.js b/assets/js/af10d9fb.a22cf0dc.js new file mode 100644 index 000000000..a3925c769 --- /dev/null +++ b/assets/js/af10d9fb.a22cf0dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8992],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=s(r),d=l,g=f["".concat(c,".").concat(d)]||f[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},p),{},{components:r})):n.createElement(g,a({ref:t},p))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/docs/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_apply.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/cli/fleet-cli/fleet"},next:{title:"fleet cleanup",permalink:"/cli/fleet-cli/fleet_cleanup"}},c={},s=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:s},f="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Create bundles from directories, and output them or apply them on a cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --context string kubeconfig context for authentication\n --correct-drift Rollback any change made from outside of Fleet\n --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated\n --correct-drift-keep-fail-history Keep helm history for failed rollbacks\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n --helm-credentials-by-path-file string Path of file containing helm credentials for paths\n --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided\n -h, --help help for apply\n --keep-resources Keep resources created after the GitRepo or Bundle is deleted\n -k, --kubeconfig string kubeconfig for authentication\n -l, --label strings Labels to apply to created bundles\n -n, --namespace string namespace (default "fleet-local")\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/af48bdba.2e5f46f8.js b/assets/js/af48bdba.2e5f46f8.js deleted file mode 100644 index f494522c2..000000000 --- a/assets/js/af48bdba.2e5f46f8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7363],{5680:(e,t,n)=>{n.d(t,{xA:()=>i,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),d=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},i=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),p=d(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},i),{},{components:n})):r.createElement(g,s({ref:t},i))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle state",o={unversionedId:"cluster-bundles-state",id:"version-0.5/cluster-bundles-state",title:"Cluster and Bundle state",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.5/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.5/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-bundles-state.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Image scan",permalink:"/0.5/imagescan"},next:{title:"Troubleshooting",permalink:"/0.5/troubleshooting"}},u={},d=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],i={toc:d},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/af48bdba.76e956a1.js b/assets/js/af48bdba.76e956a1.js new file mode 100644 index 000000000..8bc14970b --- /dev/null +++ b/assets/js/af48bdba.76e956a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7363],{5680:(e,t,n)=>{n.d(t,{xA:()=>i,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),d=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},i=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),p=d(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},i),{},{components:n})):r.createElement(g,s({ref:t},i))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle state",o={unversionedId:"cluster-bundles-state",id:"version-0.5/cluster-bundles-state",title:"Cluster and Bundle state",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.5/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.5/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-bundles-state.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Image scan",permalink:"/0.5/imagescan"},next:{title:"Troubleshooting",permalink:"/0.5/troubleshooting"}},u={},d=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],i={toc:d},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/afc4945b.011eff76.js b/assets/js/afc4945b.6645fc18.js similarity index 71% rename from assets/js/afc4945b.011eff76.js rename to assets/js/afc4945b.6645fc18.js index aac8e1879..4c2087d9b 100644 --- a/assets/js/afc4945b.011eff76.js +++ b/assets/js/afc4945b.6645fc18.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6481],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.9/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.9/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.9/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.9/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.9/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable local cluster components\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6481],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.9/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.9/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.9/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.9/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.9/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable local cluster components\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b0423865.9580be7b.js b/assets/js/b0423865.9580be7b.js new file mode 100644 index 000000000..187fce85c --- /dev/null +++ b/assets/js/b0423865.9580be7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6081],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.9/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.9/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.9/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/imagescan.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.9/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.9/bundle-add"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b0423865.b57540ef.js b/assets/js/b0423865.b57540ef.js deleted file mode 100644 index 3d4974709..000000000 --- a/assets/js/b0423865.b57540ef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6081],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.9/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.9/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.9/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/imagescan.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.9/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.9/bundle-add"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b2456c44.7ab8c2ae.js b/assets/js/b2456c44.7ab8c2ae.js new file mode 100644 index 000000000..074c46987 --- /dev/null +++ b/assets/js/b2456c44.7ab8c2ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5463],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>h});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=l,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return n?a.createElement(h,r(r({ref:t},c),{},{components:n})):a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,r=new Array(o);r[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:l,r[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(8168),l=(n(6540),n(5680));const o={},r="fleet.yaml",i={unversionedId:"ref-fleet-yaml",id:"ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a",source:"@site/docs/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-fleet-yaml.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/ref-crds"},next:{title:"GitRepo Resource",permalink:"/ref-gitrepo"}},s={},u=[{value:"Reference",id:"reference",level:3},{value:"Helm Options",id:"helm-options",level:3},{value:"How fleet-agent deploys the bundle",id:"how-fleet-agent-deploys-the-bundle",level:4},{value:"Helm Chart Download Options",id:"helm-chart-download-options",level:4},{value:"Helm Chart Value Options",id:"helm-chart-value-options",level:4},{value:"Templating",id:"templating",level:3}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a\n",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,l.yg)("p",null,"For more information on how to use the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see\n",(0,l.yg)("a",{parentName:"p",href:"/gitrepo-content"},"Git Repository Contents"),"."),(0,l.yg)("p",null,"The content of the fleet.yaml corresponds to the ",(0,l.yg)("inlineCode",{parentName:"p"},"FleetYAML")," struct at\n",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/apis/fleet.cattle.io/v1alpha1/fleetyaml.go"},"pkg/apis/fleet.cattle.io/v1alpha1/fleetyaml.go"),",\nwhich contains the ",(0,l.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,l.yg)("h3",{id:"reference"},"Reference"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified in\n# the manifests.\n#\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n#\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by\n# Fleet.\nnamespaceLabels:\n key: value\n\n# namespaceAnnotations are annotations that will be appended to the namespace\n# created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain a\n # kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n\n # These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter\n # URL or OCI registry based helm chart URL e.g.\n # "oci://ghcr.io/fleetrepoci/guestbook". This allows one to download charts\n # from most any location. Also know that go-getter URL supports adding a\n # digest to validate the download. If repo is set below this field is the name\n # of the chart to lookup.\n #\n # It is possible to download the chart from a Git repository, e.g. by using\n # `git@github.com:rancher/fleet-examples//single-cluster/helm`. If a secret\n # for the SSH key was defined in the GitRepo via `helmSecretName`, it will be\n # injected into the chart URL.\n #\n # Git repositories can be downloaded via unauthenticated http, by using for\n # example:\n #\n # `git::http://github.com/rancher/fleet-examples/single-cluster/helm`.\n chart: ./chart\n\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm\n # repository.\n repo: https://charts.rancher.io\n\n # The version of the chart or semver constraint of the chart to find. If a\n # constraint is specified it is evaluated each time git changes.\n #\n # The version also determines which chart to download from OCI registries.\n # Note: OCI registries don\'t support the \'+\' character, which is supported by\n # semver. When pushing a helm chart with a tag containing the \'+\' character\n # helm automatically replaces \'+\' to \'_\' before uploading it.\n #\n # You should use the version with the \'+\' in this file, as the \'_\' character\n # is not supported by semver and Fleet also replaces \'+\' to \'_\' when accessing\n # the OCI registry.\n version: 0.1.0\n\n # By default fleet downloads any dependency found in a helm chart. Use\n # disableDependencyUpdate: true to disable this feature.\n disableDependencyUpdate: false\n\n ### These options only work for helm-type bundles.\n #\n # Any values that should be placed in the `values.yaml` and passed to helm\n # during install.\n values:\n\n any-custom: value\n\n # All labels on Rancher clusters are available using\n # global.fleet.clusterLabels.LABELNAME These can now be accessed directly as\n # variables The variable\'s value will be an empty string if the referenced\n # cluster label does not exist on the targeted cluster.\n variableName: global.fleet.clusterLabels.LABELNAME\n\n # See Templating notes below for more information on templating.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n\n # Path to any values files that need to be passed to helm during install.\n valuesFiles:\n - values1.yaml\n - values2.yaml\n\n # Allow to use values files from configmaps or secrets defined in the\n # downstream clusters.\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply\n ### for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n #\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n #\n # Override immutable resources. This could be dangerous.\n force: false\n #\n # Set the Helm --atomic flag when upgrading\n atomic: false\n #\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n #\n # Disable DNS resolution in Helm\'s template functions\n disableDNS: false\n #\n # Skip evaluation of the values.schema.json file\n skipSchemaValidation: false\n #\n # If set and timeoutSeconds provided, will wait until all Jobs have been\n # completed before marking the GitRepo as ready. It will wait for as long as\n # timeoutSeconds.\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n#\n# Default: false\npaused: false\n\nrolloutStrategy:\n\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n #\n # default: 100%\n maxUnavailable: 15%\n\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n #\n # default: 0\n maxUnavailablePartitions: 20%\n\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n #\n # default: 25%\n autoPartitionSize: 10%\n\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n\n # A cluster group name to include in this partition\n clusterGroup: agroup\n\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified\n# per target Targets are evaluated in order and the first one to match a cluster\n# is used for that cluster.\ntargetCustomizations:\n\n # The name of target. If not specified a default name of the format\n # "target000" will be used. This value is mostly for display\n - name: prod\n\n # Custom namespace value overriding the value at the root.\n namespace: newvalue\n\n # Custom defaultNamespace value overriding the value at the root.\n defaultNamespace: newdefaultvalue\n\n # Custom kustomize options overriding the options at the root.\n kustomize: {}\n\n # Custom Helm options override the options at the root.\n helm: {}\n\n # If using raw YAML these are names that map to overlays/{name} that will be\n # used to replace or patch a resource. If you wish to customize the file\n # ./subdir/resource.yaml then a file\n # ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A\n # file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the\n # base file. A patch can in JSON Patch or JSON Merge format or a strategic\n # merge patch for builtin Kubernetes types. Refer to "Raw YAML Resource\n # Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is\n # specified, clusterSelector will be used only to further refine the\n # selection after clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io\n # resource.\n clusterName: dev-cluster\n\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n\n # A specific clusterGroup by name that will be selected.\n clusterGroup: group1\n\n # Resources will not be deployed in the matched clusters if doNotDeploy is\n # true.\n doNotDeploy: false\n\n # Drift correction removes any external change made to resources managed by\n # Fleet. It performs a helm rollback, which uses a three-way merge strategy\n # by default. It will try to update all resources by doing a PUT request if\n # force is enabled. Three-way strategic merge might fail when updating an\n # item inside of an array as it will try to add a new item instead of\n # replacing the existing one. This can be fixed by using force. Keep in\n # mind that resources might be recreated if force is enabled. Failed\n # rollback will be removed from the helm history unless keepFailHistory is\n # set to true.\n correctDrift:\n enabled: false\n force: false # Warning: it might recreate resources if set to true\n keepFailHistory: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current\n# bundle will only be deployed, after all dependencies are deployed and in a\n# Ready state.\ndependsOn:\n\n # Format:\n # - with all path separators replaced by "-"\n #\n # Example:\n #\n # GitRepo name "one", Bundle path "/multi-cluster/hello-world"\n # results in "one-multi-cluster-hello-world".\n #\n # Note:\n #\n # Bundle names are limited to 53 characters long. If longer they will be\n # shortened:\n #\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes\n # opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks\n# some conditions in Custom Resources makes the Bundle to be in an error state\n# when it shouldn\'t.\nignore:\n\n # Conditions to be ignored\n conditions:\n\n # In this example a condition will be ignored if it contains\n # {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets\n# from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n')),(0,l.yg)("h3",{id:"helm-options"},"Helm Options"),(0,l.yg)("h4",{id:"how-fleet-agent-deploys-the-bundle"},"How fleet-agent deploys the bundle"),(0,l.yg)("p",null,"These options also apply to kustomize- and manifest-style bundles. They control\nhow the fleet-agent deploys the bundle. All bundles are converted into Helm\ncharts and deployed with the Helm SDK. These options are often similar to the\nHelm CLI options for install and update."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"releaseName"),(0,l.yg)("li",{parentName:"ul"},"takeOwnership"),(0,l.yg)("li",{parentName:"ul"},"force"),(0,l.yg)("li",{parentName:"ul"},"atomic"),(0,l.yg)("li",{parentName:"ul"},"disablePreProcess"),(0,l.yg)("li",{parentName:"ul"},"disableDNS"),(0,l.yg)("li",{parentName:"ul"},"skipSchemaValidation"),(0,l.yg)("li",{parentName:"ul"},"waitForJobs")),(0,l.yg)("h4",{id:"helm-chart-download-options"},"Helm Chart Download Options"),(0,l.yg)("p",null,"These options are for Helm-style bundles, they specify how to download the\nchart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"chart"),(0,l.yg)("li",{parentName:"ul"},"repo"),(0,l.yg)("li",{parentName:"ul"},"version")),(0,l.yg)("p",null,"The reference to the chart can be either:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"a local path in the cloned Git repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),"."),(0,l.yg)("li",{parentName:"ul"},"a ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/hashicorp/go-getter?tab=readme-ov-file#url-format"},"go-getter URL"),",\nspecified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),". This can be used to download a tarball\nof the chart. go-getter also allows to download a chart from a Git repo."),(0,l.yg)("li",{parentName:"ul"},"a Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),"."),(0,l.yg)("li",{parentName:"ul"},"an OCI Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),".")),(0,l.yg)("h4",{id:"helm-chart-value-options"},"Helm Chart Value Options"),(0,l.yg)("p",null,"Options for the downloaded Helm chart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"values"),(0,l.yg)("li",{parentName:"ul"},"valuesFiles"),(0,l.yg)("li",{parentName:"ul"},"valueFrom")),(0,l.yg)("h3",{id:"templating"},"Templating"),(0,l.yg)("p",null,"It is possible to specify the keys and values as go template strings for\nadvanced templating needs. Most of the functions from the ",(0,l.yg)("a",{parentName:"p",href:"https://masterminds.github.io/sprig/"},"sprig templating\nlibrary")," are available."),(0,l.yg)("p",null,"Note that if the functions output changes with every call, e.g. ",(0,l.yg)("inlineCode",{parentName:"p"},"uuidv4"),", the\nbundle will get redeployed."),(0,l.yg)("p",null,"The template context has the following keys:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterValues")," are retrieved from target cluster's ",(0,l.yg)("inlineCode",{parentName:"li"},"spec.templateValues")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterLabels")," and ",(0,l.yg)("inlineCode",{parentName:"li"},".ClusterAnnotations")," are the labels and annotations in\nthe cluster resource."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterName")," as the fleet's cluster resource name."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterNamespace")," as the namespace in which the cluster resource exists.")),(0,l.yg)("p",null,"To access Labels or Annotations by their key name:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},'${ get .ClusterLabels "management.cattle.io/cluster-display-name" }\n')),(0,l.yg)("p",null,"Note: The fleet.yaml must be valid yaml. Templating uses ",(0,l.yg)("inlineCode",{parentName:"p"},"${ }")," as delims,\nunlike Helm which uses ",(0,l.yg)("inlineCode",{parentName:"p"},"{{ }}"),". These fleet.yaml template delimiters can be\nescaped using backticks, eg.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${`${PWD}`}\n")),(0,l.yg)("p",null,"will result in the following text:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${PWD}\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b2456c44.81fad92a.js b/assets/js/b2456c44.81fad92a.js deleted file mode 100644 index c9fd81be5..000000000 --- a/assets/js/b2456c44.81fad92a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5463],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>h});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(n),m=l,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return n?a.createElement(h,r(r({ref:t},c),{},{components:n})):a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,r=new Array(o);r[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:l,r[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(8168),l=(n(6540),n(5680));const o={},r="fleet.yaml",i={unversionedId:"ref-fleet-yaml",id:"ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a",source:"@site/docs/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-fleet-yaml.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/ref-crds"},next:{title:"GitRepo Resource",permalink:"/ref-gitrepo"}},s={},u=[{value:"Reference",id:"reference",level:3},{value:"Helm Options",id:"helm-options",level:3},{value:"How fleet-agent deploys the bundle",id:"how-fleet-agent-deploys-the-bundle",level:4},{value:"Helm Chart Download Options",id:"helm-chart-download-options",level:4},{value:"Helm Chart Value Options",id:"helm-chart-value-options",level:4},{value:"Templating",id:"templating",level:3}],c={toc:u},p="wrapper";function d(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,l.yg)("p",null,"The ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a\n",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,l.yg)("p",null,"For more information on how to use the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see\n",(0,l.yg)("a",{parentName:"p",href:"/gitrepo-content"},"Git Repository Contents"),"."),(0,l.yg)("p",null,"The content of the fleet.yaml corresponds to the ",(0,l.yg)("inlineCode",{parentName:"p"},"FleetYAML")," struct at\n",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/apis/fleet.cattle.io/v1alpha1/fleetyaml.go"},"pkg/apis/fleet.cattle.io/v1alpha1/fleetyaml.go"),",\nwhich contains the ",(0,l.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,l.yg)("h3",{id:"reference"},"Reference"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified in\n# the manifests.\n#\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n#\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by\n# Fleet.\nnamespaceLabels:\n key: value\n\n# namespaceAnnotations are annotations that will be appended to the namespace\n# created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain a\n # kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n\n # These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter\n # URL or OCI registry based helm chart URL e.g.\n # "oci://ghcr.io/fleetrepoci/guestbook". This allows one to download charts\n # from most any location. Also know that go-getter URL supports adding a\n # digest to validate the download. If repo is set below this field is the name\n # of the chart to lookup.\n #\n # It is possible to download the chart from a Git repository, e.g. by using\n # `git@github.com:rancher/fleet-examples//single-cluster/helm`. If a secret\n # for the SSH key was defined in the GitRepo via `helmSecretName`, it will be\n # injected into the chart URL.\n #\n # Git repositories can be downloaded via unauthenticated http, by using for\n # example:\n #\n # `git::http://github.com/rancher/fleet-examples/single-cluster/helm`.\n chart: ./chart\n\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm\n # repository.\n repo: https://charts.rancher.io\n\n # The version of the chart or semver constraint of the chart to find. If a\n # constraint is specified it is evaluated each time git changes.\n #\n # The version also determines which chart to download from OCI registries.\n # Note: OCI registries don\'t support the \'+\' character, which is supported by\n # semver. When pushing a helm chart with a tag containing the \'+\' character\n # helm automatically replaces \'+\' to \'_\' before uploading it.\n #\n # You should use the version with the \'+\' in this file, as the \'_\' character\n # is not supported by semver and Fleet also replaces \'+\' to \'_\' when accessing\n # the OCI registry.\n version: 0.1.0\n\n # By default fleet downloads any dependency found in a helm chart. Use\n # disableDependencyUpdate: true to disable this feature.\n disableDependencyUpdate: false\n\n ### These options only work for helm-type bundles.\n #\n # Any values that should be placed in the `values.yaml` and passed to helm\n # during install.\n values:\n\n any-custom: value\n\n # All labels on Rancher clusters are available using\n # global.fleet.clusterLabels.LABELNAME These can now be accessed directly as\n # variables The variable\'s value will be an empty string if the referenced\n # cluster label does not exist on the targeted cluster.\n variableName: global.fleet.clusterLabels.LABELNAME\n\n # See Templating notes below for more information on templating.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n\n # Path to any values files that need to be passed to helm during install.\n valuesFiles:\n - values1.yaml\n - values2.yaml\n\n # Allow to use values files from configmaps or secrets defined in the\n # downstream clusters.\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply\n ### for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n #\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n #\n # Override immutable resources. This could be dangerous.\n force: false\n #\n # Set the Helm --atomic flag when upgrading\n atomic: false\n #\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n #\n # Disable DNS resolution in Helm\'s template functions\n disableDNS: false\n #\n # Skip evaluation of the values.schema.json file\n skipSchemaValidation: false\n #\n # If set and timeoutSeconds provided, will wait until all Jobs have been\n # completed before marking the GitRepo as ready. It will wait for as long as\n # timeoutSeconds.\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n#\n# Default: false\npaused: false\n\nrolloutStrategy:\n\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n #\n # default: 100%\n maxUnavailable: 15%\n\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n #\n # default: 0\n maxUnavailablePartitions: 20%\n\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n #\n # default: 25%\n autoPartitionSize: 10%\n\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n\n # A cluster group name to include in this partition\n clusterGroup: agroup\n\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified\n# per target Targets are evaluated in order and the first one to match a cluster\n# is used for that cluster.\ntargetCustomizations:\n\n # The name of target. If not specified a default name of the format\n # "target000" will be used. This value is mostly for display\n - name: prod\n\n # Custom namespace value overriding the value at the root.\n namespace: newvalue\n\n # Custom defaultNamespace value overriding the value at the root.\n defaultNamespace: newdefaultvalue\n\n # Custom kustomize options overriding the options at the root.\n kustomize: {}\n\n # Custom Helm options override the options at the root.\n helm: {}\n\n # If using raw YAML these are names that map to overlays/{name} that will be\n # used to replace or patch a resource. If you wish to customize the file\n # ./subdir/resource.yaml then a file\n # ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A\n # file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the\n # base file. A patch can in JSON Patch or JSON Merge format or a strategic\n # merge patch for builtin Kubernetes types. Refer to "Raw YAML Resource\n # Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is\n # specified, clusterSelector will be used only to further refine the\n # selection after clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io\n # resource.\n clusterName: dev-cluster\n\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n\n # A specific clusterGroup by name that will be selected.\n clusterGroup: group1\n\n # Resources will not be deployed in the matched clusters if doNotDeploy is\n # true.\n doNotDeploy: false\n\n # Drift correction removes any external change made to resources managed by\n # Fleet. It performs a helm rollback, which uses a three-way merge strategy\n # by default. It will try to update all resources by doing a PUT request if\n # force is enabled. Three-way strategic merge might fail when updating an\n # item inside of an array as it will try to add a new item instead of\n # replacing the existing one. This can be fixed by using force. Keep in\n # mind that resources might be recreated if force is enabled. Failed\n # rollback will be removed from the helm history unless keepFailHistory is\n # set to true.\n correctDrift:\n enabled: false\n force: false # Warning: it might recreate resources if set to true\n keepFailHistory: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current\n# bundle will only be deployed, after all dependencies are deployed and in a\n# Ready state.\ndependsOn:\n\n # Format:\n # - with all path separators replaced by "-"\n #\n # Example:\n #\n # GitRepo name "one", Bundle path "/multi-cluster/hello-world"\n # results in "one-multi-cluster-hello-world".\n #\n # Note:\n #\n # Bundle names are limited to 53 characters long. If longer they will be\n # shortened:\n #\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes\n # opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks\n# some conditions in Custom Resources makes the Bundle to be in an error state\n# when it shouldn\'t.\nignore:\n\n # Conditions to be ignored\n conditions:\n\n # In this example a condition will be ignored if it contains\n # {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets\n# from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n')),(0,l.yg)("h3",{id:"helm-options"},"Helm Options"),(0,l.yg)("h4",{id:"how-fleet-agent-deploys-the-bundle"},"How fleet-agent deploys the bundle"),(0,l.yg)("p",null,"These options also apply to kustomize- and manifest-style bundles. They control\nhow the fleet-agent deploys the bundle. All bundles are converted into Helm\ncharts and deployed with the Helm SDK. These options are often similar to the\nHelm CLI options for install and update."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"releaseName"),(0,l.yg)("li",{parentName:"ul"},"takeOwnership"),(0,l.yg)("li",{parentName:"ul"},"force"),(0,l.yg)("li",{parentName:"ul"},"atomic"),(0,l.yg)("li",{parentName:"ul"},"disablePreProcess"),(0,l.yg)("li",{parentName:"ul"},"disableDNS"),(0,l.yg)("li",{parentName:"ul"},"skipSchemaValidation"),(0,l.yg)("li",{parentName:"ul"},"waitForJobs")),(0,l.yg)("h4",{id:"helm-chart-download-options"},"Helm Chart Download Options"),(0,l.yg)("p",null,"These options are for Helm-style bundles, they specify how to download the\nchart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"chart"),(0,l.yg)("li",{parentName:"ul"},"repo"),(0,l.yg)("li",{parentName:"ul"},"version")),(0,l.yg)("p",null,"The reference to the chart can be either:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"a local path in the cloned Git repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),"."),(0,l.yg)("li",{parentName:"ul"},"a ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/hashicorp/go-getter?tab=readme-ov-file#url-format"},"go-getter URL"),",\nspecified by ",(0,l.yg)("inlineCode",{parentName:"li"},"chart"),". This can be used to download a tarball\nof the chart. go-getter also allows to download a chart from a Git repo."),(0,l.yg)("li",{parentName:"ul"},"a Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),"."),(0,l.yg)("li",{parentName:"ul"},"an OCI Helm repository, specified by ",(0,l.yg)("inlineCode",{parentName:"li"},"repo")," and optionally ",(0,l.yg)("inlineCode",{parentName:"li"},"version"),".")),(0,l.yg)("h4",{id:"helm-chart-value-options"},"Helm Chart Value Options"),(0,l.yg)("p",null,"Options for the downloaded Helm chart."),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"values"),(0,l.yg)("li",{parentName:"ul"},"valuesFiles"),(0,l.yg)("li",{parentName:"ul"},"valueFrom")),(0,l.yg)("h3",{id:"templating"},"Templating"),(0,l.yg)("p",null,"It is possible to specify the keys and values as go template strings for\nadvanced templating needs. Most of the functions from the ",(0,l.yg)("a",{parentName:"p",href:"https://masterminds.github.io/sprig/"},"sprig templating\nlibrary")," are available."),(0,l.yg)("p",null,"Note that if the functions output changes with every call, e.g. ",(0,l.yg)("inlineCode",{parentName:"p"},"uuidv4"),", the\nbundle will get redeployed."),(0,l.yg)("p",null,"The template context has the following keys:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterValues")," are retrieved from target cluster's ",(0,l.yg)("inlineCode",{parentName:"li"},"spec.templateValues")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterLabels")," and ",(0,l.yg)("inlineCode",{parentName:"li"},".ClusterAnnotations")," are the labels and annotations in\nthe cluster resource."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterName")," as the fleet's cluster resource name."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},".ClusterNamespace")," as the namespace in which the cluster resource exists.")),(0,l.yg)("p",null,"To access Labels or Annotations by their key name:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},'${ get .ClusterLabels "management.cattle.io/cluster-display-name" }\n')),(0,l.yg)("p",null,"Note: The fleet.yaml must be valid yaml. Templating uses ",(0,l.yg)("inlineCode",{parentName:"p"},"${ }")," as delims,\nunlike Helm which uses ",(0,l.yg)("inlineCode",{parentName:"p"},"{{ }}"),". These fleet.yaml template delimiters can be\nescaped using backticks, eg.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${`${PWD}`}\n")),(0,l.yg)("p",null,"will result in the following text:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"foo-bar-${PWD}\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b283d2e2.2088cc2c.js b/assets/js/b283d2e2.2088cc2c.js deleted file mode 100644 index 6100aa5a9..000000000 --- a/assets/js/b283d2e2.2088cc2c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[267],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=o,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||r;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:o,l[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var a=n(8168),o=(n(6540),n(5680));const r={},l="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.8/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.8/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.8/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-fleet-yaml.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.8/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.8/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,o.yg)("p",null,"For more information on how to use the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,o.yg)("a",{parentName:"p",href:"/0.8/gitrepo-content"},"Git Repository Contents"),"."),(0,o.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),", which contains the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,o.yg)("h3",{id:"reference"},"Reference"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by Fleet.\nnamespaceLabels:\n key: value\n# namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n ### These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n\n ### These options only work for helm-type bundles\n #\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. Note, if the functions output changes with every\n # call, e.g. `uuidv4`, the bundle will get redeployed.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.\n clusterName: dev-cluster\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # Resources will not be deployed in the matched clusters if doNotDeploy is true.\n doNotDeploy: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources\n# makes the Bundle to be in an error state when it shouldn\'t.\nignore:\n # Conditions to be ignored\n conditions:\n # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b283d2e2.c136e0bb.js b/assets/js/b283d2e2.c136e0bb.js new file mode 100644 index 000000000..dc479566f --- /dev/null +++ b/assets/js/b283d2e2.c136e0bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[267],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>f});var a=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=a.createContext({}),u=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=o,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||r;return n?a.createElement(f,l(l({ref:t},c),{},{components:n})):a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:o,l[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var a=n(8168),o=(n(6540),n(5680));const r={},l="fleet.yaml",s={unversionedId:"ref-fleet-yaml",id:"version-0.8/ref-fleet-yaml",title:"fleet.yaml",description:"The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into bundle.",source:"@site/versioned_docs/version-0.8/ref-fleet-yaml.md",sourceDirName:".",slug:"/ref-fleet-yaml",permalink:"/0.8/ref-fleet-yaml",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-fleet-yaml.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources Spec",permalink:"/0.8/ref-crds"},next:{title:"GitRepo Resource",permalink:"/0.8/ref-gitrepo"}},i={},u=[{value:"Reference",id:"reference",level:3}],c={toc:u},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.yg)(d,(0,a.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"fleetyaml"},"fleet.yaml"),(0,o.yg)("p",null,"The ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file adds options to a bundle. Any directory with a ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is automatically turned into bundle."),(0,o.yg)("p",null,"For more information on how to use the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to customize bundles see ",(0,o.yg)("a",{parentName:"p",href:"/0.8/gitrepo-content"},"Git Repository Contents"),"."),(0,o.yg)("p",null,"The content of the fleet.yaml corresponds to the struct at ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/b501b7e7864d37e310dfcdb109c73e5aec4240bb/pkg/bundlereader/read.go#L132-L139"},"pkg/bundlereader/read.go"),", which contains the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),"."),(0,o.yg)("h3",{id:"reference"},"Reference"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\n# namespaceLabels are labels that will be appended to the namespace created by Fleet.\nnamespaceLabels:\n key: value\n# namespaceAnnotations are annotations that will be appended to the namespace created by Fleet.\nnamespaceAnnotations:\n key: value\n\n# Optional map of labels, that are set at the bundle and can be used in a\n# dependsOn.selector\nlabels:\n key: value\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n ### These options control how "fleet apply" downloads the chart\n #\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n\n ### These options only work for helm-type bundles\n #\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n # The variable\'s value will be an empty string if the referenced cluster label does not\n # exist on the targeted cluster\n variableName: global.fleet.clusterLabels.LABELNAME\n # It is possible to specify the keys and values as go template strings for\n # advanced templating needs. Most of the functions from the sprig templating\n # library are available. Note, if the functions output changes with every\n # call, e.g. `uuidv4`, the bundle will get redeployed.\n # The template context has following keys.\n # `.ClusterValues` are retrieved from target cluster\'s `spec.templateValues`\n # `.ClusterLabels` and `.ClusterAnnotations` are the labels and annoations in the cluster resource.\n # `.ClusterName` as the fleet\'s cluster resource name.\n # `.ClusterNamespace` as the namespace in which the cluster resource exists.\n # Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims,\n # unlike helm which uses {{ }}.\n templatedLabel: "${ .ClusterLabels.LABELNAME }-foo"\n valueFromEnv:\n "${ .ClusterLabels.ENV }": ${ .ClusterValues.someValue | upper | quote }\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets defined in the downstream clusters\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default\n key: values.yaml\n - secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n\n ### These options control how fleet-agent deploys the bundle, they also apply for kustomize- and manifest-style bundles.\n #\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # Makes helm skip the check for its own annotations\n takeOwnership: false\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n # Disable go template pre-processing on the fleet values\n disablePreProcess: false\n # if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready.\n # It will wait for as long as timeoutSeconds\n waitForJobs: true\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector:\n clusterSelector:\n matchLabels:\n env: prod\n\n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. When using Fleet in\n # Rancher, make sure to put the name of the clusters.fleet.cattle.io resource.\n clusterName: dev-cluster\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # Resources will not be deployed in the matched clusters if doNotDeploy is true.\n doNotDeploy: false\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n # Note: Bundle names are limited to 53 characters long. If longer they will be shortened:\n # opni-fleet-examples-fleets-opni-ui-plugin-operator-crd becomes opni-fleet-examples-fleets-opni-ui-plugin-opera-021f7\n - name: one-multi-cluster-hello-world\n # Select bundles to depend on based on their label.\n - selector:\n matchLabels:\n app: weak-monkey\n\n# Ignore fields when monitoring a Bundle. This can be used when Fleet thinks some conditions in Custom Resources\n# makes the Bundle to be in an error state when it shouldn\'t.\nignore:\n # Conditions to be ignored\n conditions:\n # In this example a condition will be ignored if it contains {"type": "Active", "status", "False"}\n - type: Active\n status: "False"\n\n# Override targets defined in the GitRepo. The Bundle will not have any targets from the GitRepo if overrideTargets is provided.\noverrideTargets:\n - clusterSelector:\n matchLabels:\n env: dev\n\n')))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b2dbf4a6.7330e35e.js b/assets/js/b2dbf4a6.b099573b.js similarity index 65% rename from assets/js/b2dbf4a6.7330e35e.js rename to assets/js/b2dbf4a6.b099573b.js index 98dc5ed40..bda6e0ce1 100644 --- a/assets/js/b2dbf4a6.7330e35e.js +++ b/assets/js/b2dbf4a6.b099573b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1526],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),f=c(n),p=l,d=f["".concat(i,".").concat(p)]||f[p]||g[p]||a;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,s=new Array(a);s[0]=p;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[f]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet-agent clusterstatus"},s=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_clusterstatus",id:"version-0.10/cli/fleet-agent/fleet-agent_clusterstatus",title:"",description:"fleet-agent clusterstatus",source:"@site/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_clusterstatus.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_clusterstatus",permalink:"/0.10/cli/fleet-agent/fleet-agent_clusterstatus",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_clusterstatus.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent clusterstatus"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.10/cli/fleet-agent/"},next:{title:"fleet-agent register",permalink:"/0.10/cli/fleet-agent/fleet-agent_register"}},i={},c=[{value:"fleet-agent clusterstatus",id:"fleet-agent-clusterstatus",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:c},f="wrapper";function g(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-clusterstatus"},"fleet-agent clusterstatus"),(0,l.yg)("p",null,"Continuously report resource status to the upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent clusterstatus [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for clusterstatus\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}g.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1526],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>d});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},f="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),f=c(n),p=l,d=f["".concat(i,".").concat(p)]||f[p]||g[p]||a;return n?r.createElement(d,s(s({ref:t},u),{},{components:n})):r.createElement(d,s({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,s=new Array(a);s[0]=p;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[f]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet-agent clusterstatus"},s=void 0,o={unversionedId:"cli/fleet-agent/fleet-agent_clusterstatus",id:"version-0.10/cli/fleet-agent/fleet-agent_clusterstatus",title:"",description:"fleet-agent clusterstatus",source:"@site/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_clusterstatus.md",sourceDirName:"cli/fleet-agent",slug:"/cli/fleet-agent/fleet-agent_clusterstatus",permalink:"/0.10/cli/fleet-agent/fleet-agent_clusterstatus",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-agent/fleet-agent_clusterstatus.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-agent clusterstatus"},sidebar:"docs",previous:{title:"fleet-agent",permalink:"/0.10/cli/fleet-agent/"},next:{title:"fleet-agent register",permalink:"/0.10/cli/fleet-agent/fleet-agent_register"}},i={},c=[{value:"fleet-agent clusterstatus",id:"fleet-agent-clusterstatus",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:c},f="wrapper";function g(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-agent-clusterstatus"},"fleet-agent clusterstatus"),(0,l.yg)("p",null,"Continuously report resource status to the upstream cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-agent clusterstatus [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --checkin-interval string How often to post cluster status\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -h, --help help for clusterstatus\n --kubeconfig string kubeconfig file for agent's cluster\n --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet-agent"},"fleet-agent"),"\t -")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b32c755c.0a6037b5.js b/assets/js/b32c755c.0a6037b5.js new file mode 100644 index 000000000..d828eb1cf --- /dev/null +++ b/assets/js/b32c755c.0a6037b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2547],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs for Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.5/bundle-diffs",title:"Generating Diffs for Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.5/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.5/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/bundle-diffs.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.5/gitrepo-targets"},next:{title:"Webhook",permalink:"/0.5/webhook"}},l={},p=[{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-for-modified-gitrepos"},"Generating Diffs for Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec. "),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")," "),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/b32c755c.686ca006.js b/assets/js/b32c755c.686ca006.js deleted file mode 100644 index c762850c3..000000000 --- a/assets/js/b32c755c.686ca006.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2547],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs for Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.5/bundle-diffs",title:"Generating Diffs for Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.5/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.5/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/bundle-diffs.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.5/gitrepo-targets"},next:{title:"Webhook",permalink:"/0.5/webhook"}},l={},p=[{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-for-modified-gitrepos"},"Generating Diffs for Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec. "),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")," "),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/b45da50c.a1399b20.js b/assets/js/b45da50c.a1399b20.js new file mode 100644 index 000000000..b2d92f119 --- /dev/null +++ b/assets/js/b45da50c.a1399b20.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5847],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=s(r),d=l,g=f["".concat(c,".").concat(d)]||f[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},p),{},{components:r})):n.createElement(g,a({ref:t},p))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.10/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.10/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.10/cli/fleet-cli/fleet"},next:{title:"fleet cleanup",permalink:"/0.10/cli/fleet-cli/fleet_cleanup"}},c={},s=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:s},f="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Create bundles from directories, and output them or apply them on a cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --context string kubeconfig context for authentication\n --correct-drift Rollback any change made from outside of Fleet\n --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated\n --correct-drift-keep-fail-history Keep helm history for failed rollbacks\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n --helm-credentials-by-path-file string Path of file containing helm credentials for paths\n --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided\n -h, --help help for apply\n --keep-resources Keep resources created after the GitRepo or Bundle is deleted\n -k, --kubeconfig string kubeconfig for authentication\n -l, --label strings Labels to apply to created bundles\n -n, --namespace string namespace (default "fleet-local")\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b45da50c.d8383617.js b/assets/js/b45da50c.d8383617.js deleted file mode 100644 index 78fce36dd..000000000 --- a/assets/js/b45da50c.d8383617.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5847],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=s(r),d=l,g=f["".concat(c,".").concat(d)]||f[d]||u[d]||o;return r?n.createElement(g,a(a({ref:t},p),{},{components:r})):n.createElement(g,a({ref:t},p))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.10/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.10/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.10/cli/fleet-cli/fleet"},next:{title:"fleet cleanup",permalink:"/0.10/cli/fleet-cli/fleet_cleanup"}},c={},s=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:s},f="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Create bundles from directories, and output them or apply them on a cluster"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --context string kubeconfig context for authentication\n --correct-drift Rollback any change made from outside of Fleet\n --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated\n --correct-drift-keep-fail-history Keep helm history for failed rollbacks\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n --helm-credentials-by-path-file string Path of file containing helm credentials for paths\n --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided\n -h, --help help for apply\n --keep-resources Keep resources created after the GitRepo or Bundle is deleted\n -k, --kubeconfig string kubeconfig for authentication\n -l, --label strings Labels to apply to created bundles\n -n, --namespace string namespace (default "fleet-local")\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b60b3bd8.fc23a8e9.js b/assets/js/b60b3bd8.47b79bbc.js similarity index 68% rename from assets/js/b60b3bd8.fc23a8e9.js rename to assets/js/b60b3bd8.47b79bbc.js index ab8f908d2..9fcbaa982 100644 --- a/assets/js/b60b3bd8.fc23a8e9.js +++ b/assets/js/b60b3bd8.47b79bbc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1254],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),d=a,g=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?n.createElement(g,s(s({ref:t},i),{},{components:r})):n.createElement(g,s({ref:t},i))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.4/cluster-group",title:"Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.4/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.4/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-group.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Manager Initiated",permalink:"/0.4/manager-initiated"},next:{title:"Namespaces",permalink:"/0.4/namespaces"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-groups"},"Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1254],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),d=a,g=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?n.createElement(g,s(s({ref:t},i),{},{components:r})):n.createElement(g,s({ref:t},i))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.4/cluster-group",title:"Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.4/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.4/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-group.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Manager Initiated",permalink:"/0.4/manager-initiated"},next:{title:"Namespaces",permalink:"/0.4/namespaces"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-groups"},"Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b753e7fe.12920716.js b/assets/js/b753e7fe.125f5b3b.js similarity index 72% rename from assets/js/b753e7fe.12920716.js rename to assets/js/b753e7fe.125f5b3b.js index 75c8840c2..9df9f4c41 100644 --- a/assets/js/b753e7fe.12920716.js +++ b/assets/js/b753e7fe.125f5b3b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2673],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),i=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},g=function(e){var t=i(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,g=c(e,["components","mdxType","originalType","parentName"]),s=i(n),f=a,y=s["".concat(p,".").concat(f)]||s[f]||u[f]||o;return n?r.createElement(y,l(l({ref:t},g),{},{components:n})):r.createElement(y,l({ref:t},g))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=f;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[s]="string"==typeof e?e:a,l[1]=c;for(var i=2;i{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const o={title:"0.8 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.8/changelogs/index",title:"0.8 Changelogs",description:"* v0.8.5 (latest)",source:"@site/versioned_docs/version-0.8/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.8/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/index.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"0.8 Changelogs"}},p={},i=[],g={toc:i},s="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(s,(0,r.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.5"},"v0.8.5")," (latest)")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.4"})," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.3"},"v0.8.3")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.2"},"v0.8.2")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.1"},"v0.8.1")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.0"},"v0.8.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2673],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=r.createContext({}),i=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},g=function(e){var t=i(e.components);return r.createElement(p.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,g=c(e,["components","mdxType","originalType","parentName"]),s=i(n),f=a,y=s["".concat(p,".").concat(f)]||s[f]||u[f]||o;return n?r.createElement(y,l(l({ref:t},g),{},{components:n})):r.createElement(y,l({ref:t},g))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=f;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[s]="string"==typeof e?e:a,l[1]=c;for(var i=2;i{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const o={title:"0.8 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.8/changelogs/index",title:"0.8 Changelogs",description:"* v0.8.5 (latest)",source:"@site/versioned_docs/version-0.8/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.8/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/index.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"0.8 Changelogs"}},p={},i=[],g={toc:i},s="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(s,(0,r.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.5"},"v0.8.5")," (latest)")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.4"})," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.3"},"v0.8.3")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.2"},"v0.8.2")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.1"},"v0.8.1")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.8/changelogs/changelogs/v0.8.0"},"v0.8.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b7ae13b2.4c0e3323.js b/assets/js/b7ae13b2.741f6962.js similarity index 75% rename from assets/js/b7ae13b2.4c0e3323.js rename to assets/js/b7ae13b2.741f6962.js index fcce817c3..221caf926 100644 --- a/assets/js/b7ae13b2.4c0e3323.js +++ b/assets/js/b7ae13b2.741f6962.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2404],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=s(n),d=l,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/docs/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/uninstall.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/tut-deployment"},next:{title:"Architecture",permalink:"/architecture"}},c={},s=[],p={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2404],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=s(n),d=l,f=u["".concat(c,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/docs/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/uninstall.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/tut-deployment"},next:{title:"Architecture",permalink:"/architecture"}},c={},s=[],p={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8f3160f.162a2ca5.js b/assets/js/b8f3160f.162a2ca5.js deleted file mode 100644 index 7e10511f5..000000000 --- a/assets/js/b8f3160f.162a2ca5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5251],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/docs/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/gitrepo-targets.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8f3160f.a5448e54.js b/assets/js/b8f3160f.a5448e54.js new file mode 100644 index 000000000..ac0daab09 --- /dev/null +++ b/assets/js/b8f3160f.a5448e54.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5251],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>d});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(a),g=r,d=m["".concat(s,".").concat(g)]||m[g]||c[g]||l;return a?n.createElement(d,o(o({ref:t},u),{},{components:a})):n.createElement(d,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Mapping to Downstream Clusters",i={unversionedId:"gitrepo-targets",id:"gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Fleet in Rancher allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration.",source:"@site/docs/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/gitrepo-targets.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create a GitRepo Resource",permalink:"/gitrepo-add"},next:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/bundle-diffs"}},s={},p=[{value:"Defining Targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default Target",id:"default-target",level:2},{value:"Customization per Cluster",id:"customization-per-cluster",level:2},{value:"Supported Customizations",id:"supported-customizations",level:3},{value:"Additional Examples",id:"additional-examples",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(m,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style\nIf no targets are specified, i.e. when using a single-cluster, the bundles target the default cluster group.")),(0,r.yg)("p",null,"When deploying ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,r.yg)("h2",{id:"defining-targets"},"Defining Targets"),(0,r.yg)("p",null,"The deployment targets of ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n # A specific cluster by name that will be selected\n clusterName: cluster1\n')),(0,r.yg)("h2",{id:"target-matching"},"Target Matching"),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,r.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n # Match everything\n - clusterSelector: {}\n # Selector ignored\n - clusterSelector: null\n")),(0,r.yg)("p",null,"You can also match clusters by name:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n - clusterName: fleetname\n")),(0,r.yg)("p",null,"When using Fleet in Rancher, make sure to put the name of the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters.fleet.cattle.io")," resource."),(0,r.yg)("h2",{id:"default-target"},"Default Target"),(0,r.yg)("p",null,"If no target is set for the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,r.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."),(0,r.yg)("h2",{id:"customization-per-cluster"},"Customization per Cluster"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targets:")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource select clusters to deploy on. The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations:")," in ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," override Helm values only and do not change targeting.")),(0,r.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters with customization using Fleet, we will use ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,r.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Expected behavior:")),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,r.yg)("li",{parentName:"ul"},"After deploying to the ",(0,r.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,r.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,r.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,r.yg)("li",{parentName:"ol"},"Under ",(0,r.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,r.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,r.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),":")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Result:")),(0,r.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,r.yg)("blockquote",null,(0,r.yg)("p",{parentName:"blockquote"},(0,r.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,r.yg)("h3",{id:"supported-customizations"},"Supported Customizations"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"DefaultNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ForceSyncGeneration"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"KeepResources"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"ServiceAccount"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#bundledeploymentoptions"},"TargetNamespace"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Atomic"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Chart"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.DisablePreProcess"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Force"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ReleaseName"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Repo"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TakeOwnership"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.TimeoutSeconds"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.ValuesFrom"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Values"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.Version")),(0,r.yg)("admonition",{parentName:"li",title:"important information",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"Overriding the version of a Helm chart via target customizations will lead to bundles containing ",(0,r.yg)("em",{parentName:"p"},"all")," versions, ie the\ndefault one and the custom one(s), of the chart, to accommodate all clusters. This in turn means that Fleet will\ndeploy larger bundles."),(0,r.yg)("p",{parentName:"admonition"},"As Fleet stores bundles via etcd, this may cause issues on some clusters where resultant bundle sizes may exceed\netcd's configured maximum blob size. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/issues/1650"},"this issue")," for more details."))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#helmoptions"},"Helm.WaitForJobs"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#kustomizeoptions"},"Kustomize.Dir"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#yamloptions"},"YAML.Overlays"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"/ref-crds#diffoptions"},"Diff.ComparePatches")))),(0,r.yg)("h2",{id:"additional-examples"},"Additional Examples"),(0,r.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b9a03c38.17f93d5d.js b/assets/js/b9a03c38.17f93d5d.js deleted file mode 100644 index 1dd5ceab0..000000000 --- a/assets/js/b9a03c38.17f93d5d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3888],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>y});var l=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=l.createContext({}),p=function(e){var t=l.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return l.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,y=m["".concat(s,".").concat(d)]||m[d]||u[d]||r;return n?l.createElement(y,o(o({ref:t},c),{},{components:n})):l.createElement(y,o({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var l=n(8168),a=(n(6540),n(5680));const r={},o="Examples",i={unversionedId:"examples",id:"version-0.5/examples",title:"Examples",description:"Lifecycle of a Fleet Bundle",source:"@site/versioned_docs/version-0.5/examples.md",sourceDirName:".",slug:"/examples",permalink:"/0.5/examples",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/examples.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.5/architecture"},next:{title:"Overview",permalink:"/0.5/cluster-overview"}},s={},p=[{value:"Lifecycle of a Fleet Bundle",id:"lifecycle-of-a-fleet-bundle",level:3},{value:"Deploy Kubernetes Manifests Across Clusters with Customization",id:"deploy-kubernetes-manifests-across-clusters-with-customization",level:3},{value:"Additional Examples",id:"additional-examples",level:3}],c={toc:p},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(m,(0,l.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"examples"},"Examples"),(0,a.yg)("h3",{id:"lifecycle-of-a-fleet-bundle"},"Lifecycle of a Fleet Bundle"),(0,a.yg)("p",null,"To demonstrate the lifecycle of a Fleet bundle, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"User will create a ",(0,a.yg)("a",{parentName:"li",href:"/0.5/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,a.yg)("a",{parentName:"li",href:"/0.5/webhook"},"webhook event"),". With every commit change, the ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,a.yg)("a",{parentName:"li",href:"/0.5/cluster-bundles-state#bundles"},"bundle"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,a.yg)("ol",{start:3},(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,a.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,a.yg)("h3",{id:"deploy-kubernetes-manifests-across-clusters-with-customization"},"Deploy Kubernetes Manifests Across Clusters with Customization"),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,a.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters using Fleet, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml")," as a case study."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,a.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,a.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,a.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Expected behavior:")," "),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,a.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,a.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,a.yg)("li",{parentName:"ol"},"Under ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,a.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),": ")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Result:")),(0,a.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,a.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,a.yg)("h3",{id:"additional-examples"},"Additional Examples"),(0,a.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b9a03c38.73be24d2.js b/assets/js/b9a03c38.73be24d2.js new file mode 100644 index 000000000..22f5cf461 --- /dev/null +++ b/assets/js/b9a03c38.73be24d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3888],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>y});var l=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=l.createContext({}),p=function(e){var t=l.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return l.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,y=m["".concat(s,".").concat(d)]||m[d]||u[d]||r;return n?l.createElement(y,o(o({ref:t},c),{},{components:n})):l.createElement(y,o({ref:t},c))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var l=n(8168),a=(n(6540),n(5680));const r={},o="Examples",i={unversionedId:"examples",id:"version-0.5/examples",title:"Examples",description:"Lifecycle of a Fleet Bundle",source:"@site/versioned_docs/version-0.5/examples.md",sourceDirName:".",slug:"/examples",permalink:"/0.5/examples",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/examples.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.5/architecture"},next:{title:"Overview",permalink:"/0.5/cluster-overview"}},s={},p=[{value:"Lifecycle of a Fleet Bundle",id:"lifecycle-of-a-fleet-bundle",level:3},{value:"Deploy Kubernetes Manifests Across Clusters with Customization",id:"deploy-kubernetes-manifests-across-clusters-with-customization",level:3},{value:"Additional Examples",id:"additional-examples",level:3}],c={toc:p},m="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(m,(0,l.A)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"examples"},"Examples"),(0,a.yg)("h3",{id:"lifecycle-of-a-fleet-bundle"},"Lifecycle of a Fleet Bundle"),(0,a.yg)("p",null,"To demonstrate the lifecycle of a Fleet bundle, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"User will create a ",(0,a.yg)("a",{parentName:"li",href:"/0.5/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,a.yg)("a",{parentName:"li",href:"/0.5/webhook"},"webhook event"),". With every commit change, the ",(0,a.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,a.yg)("a",{parentName:"li",href:"/0.5/cluster-bundles-state#bundles"},"bundle"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,a.yg)("ol",{start:3},(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,a.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,a.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,a.yg)("li",{parentName:"ol"},"The ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,a.yg)("h3",{id:"deploy-kubernetes-manifests-across-clusters-with-customization"},"Deploy Kubernetes Manifests Across Clusters with Customization"),(0,a.yg)("p",null,(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/"},"Fleet in Rancher")," allows users to manage clusters easily as if they were one cluster. Users can deploy bundles, which can be comprised of deployment manifests or any other Kubernetes resource, across clusters using grouping configuration."),(0,a.yg)("p",null,"To demonstrate how to deploy Kubernetes manifests across different clusters using Fleet, we will use ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/blob/master/multi-cluster/helm/fleet.yaml"},"multi-cluster/helm/fleet.yaml")," as a case study."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Situation:")," User has three clusters with three different labels: ",(0,a.yg)("inlineCode",{parentName:"p"},"env=dev"),", ",(0,a.yg)("inlineCode",{parentName:"p"},"env=test"),", and ",(0,a.yg)("inlineCode",{parentName:"p"},"env=prod"),". User wants to deploy a frontend application with a backend database across these clusters. "),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Expected behavior:")," "),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"dev")," cluster, database replication is not enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"test")," cluster, database replication is enabled."),(0,a.yg)("li",{parentName:"ul"},"After deploying to the ",(0,a.yg)("inlineCode",{parentName:"li"},"prod")," cluster, database replication is enabled and Load balancer services are exposed.")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Advantage of Fleet:")),(0,a.yg)("p",null,"Instead of deploying the app on each cluster, Fleet allows you to deploy across all clusters following these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Deploy gitRepo ",(0,a.yg)("inlineCode",{parentName:"li"},"https://github.com/rancher/fleet-examples.git")," and specify the path ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),"."),(0,a.yg)("li",{parentName:"ol"},"Under ",(0,a.yg)("inlineCode",{parentName:"li"},"multi-cluster/helm"),", a Helm chart will deploy the frontend app service and backend database service."),(0,a.yg)("li",{parentName:"ol"},"The following rule will be defined in ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet.yaml"),": ")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"targetCustomizations:\n- name: dev\n helm:\n values:\n replication: false\n clusterSelector:\n matchLabels:\n env: dev\n\n- name: test\n helm:\n values:\n replicas: 3\n clusterSelector:\n matchLabels:\n env: test\n\n- name: prod\n helm:\n values:\n serviceType: LoadBalancer\n replicas: 3\n clusterSelector:\n matchLabels:\n env: prod\n")),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Result:")),(0,a.yg)("p",null,"Fleet will deploy the Helm chart with your customized ",(0,a.yg)("inlineCode",{parentName:"p"},"values.yaml")," to the different clusters."),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Note:")," Configuration management is not limited to deployments but can be expanded to general configuration management. Fleet is able to apply configuration management through customization among any set of clusters automatically.")),(0,a.yg)("h3",{id:"additional-examples"},"Additional Examples"),(0,a.yg)("p",null,"Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations\nof the three are in the ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/"},"Fleet Examples repo"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bcd76598.77718dd0.js b/assets/js/bcd76598.1972e8f7.js similarity index 54% rename from assets/js/bcd76598.77718dd0.js rename to assets/js/bcd76598.1972e8f7.js index 2aa8073b8..1bd94c6e3 100644 --- a/assets/js/bcd76598.77718dd0.js +++ b/assets/js/bcd76598.1972e8f7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6233],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.9/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.9/index.md",sourceDirName:".",slug:"/",permalink:"/0.9/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/index.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.9/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6233],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.9/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.9/index.md",sourceDirName:".",slug:"/",permalink:"/0.9/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/index.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.9/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file diff --git a/assets/js/bd465781.235595eb.js b/assets/js/bd465781.02dc1c3d.js similarity index 60% rename from assets/js/bd465781.235595eb.js rename to assets/js/bd465781.02dc1c3d.js index 7971537fd..4860cdbe0 100644 --- a/assets/js/bd465781.235595eb.js +++ b/assets/js/bd465781.02dc1c3d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5554],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var l=r(6540);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,l)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=l.createContext({}),p=function(e){var t=l.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},y=l.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),s=p(r),y=n,d=s["".concat(c,".").concat(y)]||s[y]||u[y]||a;return r?l.createElement(d,o(o({ref:t},f),{},{components:r})):l.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=y;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var l=r(8168),n=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/docs/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent register",permalink:"/cli/fleet-agent/fleet-agent_register"},next:{title:"fleet apply",permalink:"/cli/fleet-cli/fleet_apply"}},c={},p=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},s="wrapper";function u(e){let{components:t,...r}=e;return(0,n.yg)(s,(0,l.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"fleet"},"fleet"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,n.yg)("h3",{id:"options"},"Options"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"}," -h, --help help for fleet\n")),(0,n.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Create bundles from directories, and output them or apply them on a cluster"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_cleanup"},"fleet cleanup"),"\t - Clean up outdated cluster registrations"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_deploy"},"fleet deploy"),"\t - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_gitcloner"},"fleet gitcloner"),"\t - Clones a git repository"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_target"},"fleet target"),"\t - Print available targets for a bundle")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5554],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var l=r(6540);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,l)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=l.createContext({}),p=function(e){var t=l.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},y=l.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),s=p(r),y=n,d=s["".concat(c,".").concat(y)]||s[y]||u[y]||a;return r?l.createElement(d,o(o({ref:t},f),{},{components:r})):l.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=y;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var l=r(8168),n=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/docs/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent register",permalink:"/cli/fleet-agent/fleet-agent_register"},next:{title:"fleet apply",permalink:"/cli/fleet-cli/fleet_apply"}},c={},p=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},s="wrapper";function u(e){let{components:t,...r}=e;return(0,n.yg)(s,(0,l.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"fleet"},"fleet"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,n.yg)("h3",{id:"options"},"Options"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"}," -h, --help help for fleet\n")),(0,n.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Create bundles from directories, and output them or apply them on a cluster"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_cleanup"},"fleet cleanup"),"\t - Clean up outdated cluster registrations"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_deploy"},"fleet deploy"),"\t - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_gitcloner"},"fleet gitcloner"),"\t - Clones a git repository"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_target"},"fleet target"),"\t - Print available targets for a bundle")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bf20a2eb.e6610e37.js b/assets/js/bf20a2eb.e6610e37.js deleted file mode 100644 index 0c85b0a5b..000000000 --- a/assets/js/bf20a2eb.e6610e37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7585],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,g=h["".concat(s,".").concat(p)]||h[p]||u[p]||n;return a?r.createElement(g,o(o({ref:t},d),{},{components:a})):r.createElement(g,o({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=p;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[h]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.9.3",date:"2024-04-17 09:34:37 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.3",id:"version-0.9/changelogs/changelogs/v0.9.3",title:"v0.9.3",description:"(rancherio-gh-m) released this 2024-04-17 0937 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.3.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.3",permalink:"/0.9/changelogs/changelogs/v0.9.3",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.3.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.9.3",date:"2024-04-17 09:34:37 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.2",permalink:"/0.9/changelogs/changelogs/v0.9.2"},next:{title:"v0.9.4",permalink:"/0.9/changelogs/changelogs/v0.9.4"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-04-17 09:34:37 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Prevent creating Content objects if Bundle does not match any target by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2176449663","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2215","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2215/hovercard",href:"https://github.com/rancher/fleet/pull/2215"},"#2215"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump github.com/docker/docker to v23.0.10 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231242144","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2308","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2308/hovercard",href:"https://github.com/rancher/fleet/pull/2308"},"#2308")),(0,l.yg)("li",null,"Bump github.com/containerd/containerd to 1.7.11 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231242144","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2308","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2308/hovercard",href:"https://github.com/rancher/fleet/pull/2308"},"#2308")),(0,l.yg)("li",null,"Bump google.golang.org/protobuf to v1.33.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231242144","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2308","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2308/hovercard",href:"https://github.com/rancher/fleet/pull/2308"},"#2308")),(0,l.yg)("li",null,"Bump k8s to 0.28.8 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2232624741","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2310","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2310/hovercard",href:"https://github.com/rancher/fleet/pull/2310"},"#2310")),(0,l.yg)("li",null,"Bump Gitjob to v0.9.6 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2237147792","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2320","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2320/hovercard",href:"https://github.com/rancher/fleet/pull/2320"},"#2320"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.2...v0.9.3"},(0,l.yg)("tt",null,"v0.9.2...v0.9.3"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-crd-0.9.3.tgz"},"fleet-crd-0.9.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-agent-0.9.3.tgz"},"fleet-agent-0.9.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-0.9.3.tgz"},"fleet-0.9.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.3"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bf20a2eb.ffda737a.js b/assets/js/bf20a2eb.ffda737a.js new file mode 100644 index 000000000..3e27b862a --- /dev/null +++ b/assets/js/bf20a2eb.ffda737a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7585],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,g=h["".concat(s,".").concat(p)]||h[p]||u[p]||n;return a?r.createElement(g,o(o({ref:t},d),{},{components:a})):r.createElement(g,o({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=p;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[h]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.9.3",date:"2024-04-17 09:34:37 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.9.3",id:"version-0.9/changelogs/changelogs/v0.9.3",title:"v0.9.3",description:"(rancherio-gh-m) released this 2024-04-17 0937 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.3.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.3",permalink:"/0.9/changelogs/changelogs/v0.9.3",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.3.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.9.3",date:"2024-04-17 09:34:37 +0000 UTC"},sidebar:"docs",previous:{title:"v0.9.2",permalink:"/0.9/changelogs/changelogs/v0.9.2"},next:{title:"v0.9.4",permalink:"/0.9/changelogs/changelogs/v0.9.4"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-04-17 09:34:37 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Prevent creating Content objects if Bundle does not match any target by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2176449663","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2215","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2215/hovercard",href:"https://github.com/rancher/fleet/pull/2215"},"#2215"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump github.com/docker/docker to v23.0.10 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231242144","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2308","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2308/hovercard",href:"https://github.com/rancher/fleet/pull/2308"},"#2308")),(0,l.yg)("li",null,"Bump github.com/containerd/containerd to 1.7.11 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231242144","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2308","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2308/hovercard",href:"https://github.com/rancher/fleet/pull/2308"},"#2308")),(0,l.yg)("li",null,"Bump google.golang.org/protobuf to v1.33.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231242144","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2308","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2308/hovercard",href:"https://github.com/rancher/fleet/pull/2308"},"#2308")),(0,l.yg)("li",null,"Bump k8s to 0.28.8 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2232624741","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2310","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2310/hovercard",href:"https://github.com/rancher/fleet/pull/2310"},"#2310")),(0,l.yg)("li",null,"Bump Gitjob to v0.9.6 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2237147792","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2320","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2320/hovercard",href:"https://github.com/rancher/fleet/pull/2320"},"#2320"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.9.2...v0.9.3"},(0,l.yg)("tt",null,"v0.9.2...v0.9.3"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-crd-0.9.3.tgz"},"fleet-crd-0.9.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-agent-0.9.3.tgz"},"fleet-agent-0.9.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-0.9.3.tgz"},"fleet-0.9.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.3/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.3"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c107a2c8.8697997e.js b/assets/js/c107a2c8.73562cc0.js similarity index 87% rename from assets/js/c107a2c8.8697997e.js rename to assets/js/c107a2c8.73562cc0.js index 355da267c..019510040 100644 --- a/assets/js/c107a2c8.8697997e.js +++ b/assets/js/c107a2c8.73562cc0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4836],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),g=o,d=u["".concat(i,".").concat(g)]||u[g]||f[g]||a;return r?n.createElement(d,c(c({ref:t},p),{},{components:r})):n.createElement(d,c({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=g;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.6 Changelogs"},c=void 0,l={unversionedId:"changelogs/index",id:"version-0.6/changelogs/index",title:"0.6 Changelogs",description:"* v0.6.0 (latest)",source:"@site/versioned_docs/version-0.6/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.6/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/changelogs/index.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"0.6 Changelogs"}},i={},s=[],p={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/0.6/changelogs/changelogs/v0.6.0"},"v0.6.0")," (latest)")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4836],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),g=o,d=u["".concat(i,".").concat(g)]||u[g]||f[g]||a;return r?n.createElement(d,c(c({ref:t},p),{},{components:r})):n.createElement(d,c({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=g;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.6 Changelogs"},c=void 0,l={unversionedId:"changelogs/index",id:"version-0.6/changelogs/index",title:"0.6 Changelogs",description:"* v0.6.0 (latest)",source:"@site/versioned_docs/version-0.6/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.6/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/changelogs/index.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"0.6 Changelogs"}},i={},s=[],p={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/0.6/changelogs/changelogs/v0.6.0"},"v0.6.0")," (latest)")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c1900591.629b8b88.js b/assets/js/c1900591.629b8b88.js deleted file mode 100644 index a590d0e0c..000000000 --- a/assets/js/c1900591.629b8b88.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5899],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.10/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.10/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.10/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/multi-user.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.10/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.10/gitrepo-add"}},i={},c=[{value:"Example Fleet Standalone",id:"example-fleet-standalone",level:2},{value:"Example Fleet in Rancher",id:"example-fleet-in-rancher",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.10/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-fleet-standalone"},"Example Fleet Standalone"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"example-fleet-in-rancher"},"Example Fleet in Rancher"),(0,a.yg)("p",null,"When a new fleet workspace is created, a corresponding namespace with an identical name is automatically generated within the Rancher local cluster.\nFor a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"list/get the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleetworkspace")," cluster-wide resource in the local cluster"),(0,a.yg)("li",{parentName:"ul"},"Permissions to create fleet resources (such as ",(0,a.yg)("inlineCode",{parentName:"li"},"bundles"),", ",(0,a.yg)("inlineCode",{parentName:"li"},"gitrepos"),", ...) in the backing namespace for the workspace in the local cluster. ")),(0,a.yg)("p",null,"Let's grant permissions to deploy fleet resources in the ",(0,a.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"project2")," fleet workspaces:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"To create the ",(0,a.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces, you can either do it in the ",(0,a.yg)("a",{parentName:"li",href:"https://ranchermanager.docs.rancher.com/integrations-in-rancher/fleet/overview#accessing-fleet-in-the-rancher-ui"},"Rancher UI")," or use the following YAML resources:")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project1\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project2\n")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"GlobalRole")," that grants permission to deploy fleet resources in the ",(0,a.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces:")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: GlobalRole\nmetadata:\n name: fleet-projects1and2\nnamespacedRules:\n project1:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\n project2:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\nrules:\n - apiGroups:\n - management.cattle.io\n resourceNames:\n - project1\n - project2\n resources:\n - fleetworkspaces\n verbs:\n - '*'\n")),(0,a.yg)("p",null,"Assign the ",(0,a.yg)("inlineCode",{parentName:"p"},"GlobalRole")," to users or groups, more info can be found in the ",(0,a.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/authentication-permissions-and-global-configuration/manage-role-based-access-control-rbac/global-permissions#configuring-global-permissions-for-individual-users"},"Rancher docs")),(0,a.yg)("p",null,"The user now has access to the ",(0,a.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," tab in Rancher and can deploy resources to both the ",(0,a.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"project2")," workspaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.10/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.10/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/c1900591.cce1dc69.js b/assets/js/c1900591.cce1dc69.js new file mode 100644 index 000000000..873faaf39 --- /dev/null +++ b/assets/js/c1900591.cce1dc69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5899],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.10/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.10/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.10/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/multi-user.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.10/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.10/gitrepo-add"}},i={},c=[{value:"Example Fleet Standalone",id:"example-fleet-standalone",level:2},{value:"Example Fleet in Rancher",id:"example-fleet-in-rancher",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.10/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-fleet-standalone"},"Example Fleet Standalone"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"example-fleet-in-rancher"},"Example Fleet in Rancher"),(0,a.yg)("p",null,"When a new fleet workspace is created, a corresponding namespace with an identical name is automatically generated within the Rancher local cluster.\nFor a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"list/get the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleetworkspace")," cluster-wide resource in the local cluster"),(0,a.yg)("li",{parentName:"ul"},"Permissions to create fleet resources (such as ",(0,a.yg)("inlineCode",{parentName:"li"},"bundles"),", ",(0,a.yg)("inlineCode",{parentName:"li"},"gitrepos"),", ...) in the backing namespace for the workspace in the local cluster. ")),(0,a.yg)("p",null,"Let's grant permissions to deploy fleet resources in the ",(0,a.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"project2")," fleet workspaces:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"To create the ",(0,a.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces, you can either do it in the ",(0,a.yg)("a",{parentName:"li",href:"https://ranchermanager.docs.rancher.com/integrations-in-rancher/fleet/overview#accessing-fleet-in-the-rancher-ui"},"Rancher UI")," or use the following YAML resources:")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project1\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: FleetWorkspace\nmetadata:\n name: project2\n")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Create a ",(0,a.yg)("inlineCode",{parentName:"li"},"GlobalRole")," that grants permission to deploy fleet resources in the ",(0,a.yg)("inlineCode",{parentName:"li"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"li"},"project2")," fleet workspaces:")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"apiVersion: management.cattle.io/v3\nkind: GlobalRole\nmetadata:\n name: fleet-projects1and2\nnamespacedRules:\n project1:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\n project2:\n - apiGroups:\n - fleet.cattle.io\n resources:\n - gitrepos\n - bundles\n - clusterregistrationtokens\n - gitreporestrictions\n - clusters\n - clustergroups\n verbs:\n - '*'\nrules:\n - apiGroups:\n - management.cattle.io\n resourceNames:\n - project1\n - project2\n resources:\n - fleetworkspaces\n verbs:\n - '*'\n")),(0,a.yg)("p",null,"Assign the ",(0,a.yg)("inlineCode",{parentName:"p"},"GlobalRole")," to users or groups, more info can be found in the ",(0,a.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/authentication-permissions-and-global-configuration/manage-role-based-access-control-rbac/global-permissions#configuring-global-permissions-for-individual-users"},"Rancher docs")),(0,a.yg)("p",null,"The user now has access to the ",(0,a.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," tab in Rancher and can deploy resources to both the ",(0,a.yg)("inlineCode",{parentName:"p"},"project1")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"project2")," workspaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.10/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.10/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/c1b42080.948218f7.js b/assets/js/c1b42080.948218f7.js new file mode 100644 index 000000000..d96ab1387 --- /dev/null +++ b/assets/js/c1b42080.948218f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5167],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(a),d=l,g=u["".concat(i,".").concat(d)]||u[d]||h[d]||n;return a?r.createElement(g,o(o({ref:t},p),{},{components:a})):r.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=d;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:l,o[1]=s;for(var c=2;c{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.7.1",date:"2023-08-16 10:56:37 +0000 UTC"},o=void 0,s={unversionedId:"changelogs/changelogs/v0.7.1",id:"version-0.7/changelogs/changelogs/v0.7.1",title:"v0.7.1",description:"(rancherio-gh-m) released this 2023-08-16 1037 +0000 UTC",source:"@site/versioned_docs/version-0.7/changelogs/changelogs/v0.7.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.7.1",permalink:"/0.7/changelogs/changelogs/v0.7.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/changelogs/changelogs/v0.7.1.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.7.1",date:"2023-08-16 10:56:37 +0000 UTC"},sidebar:"docs",previous:{title:"v0.7.0",permalink:"/0.7/changelogs/changelogs/v0.7.0"}},i={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-08-16 10:56:37 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Helm release name fix by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1816053596","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1665","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1665/hovercard",href:"https://github.com/rancher/fleet/pull/1665"},"#1665")),(0,l.yg)("li",null,"Clean up cluster registrations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1815987464","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1664","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1664/hovercard",href:"https://github.com/rancher/fleet/pull/1664"},"#1664")," / ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1822066410","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1677","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1677/hovercard",href:"https://github.com/rancher/fleet/pull/1677"},"#1677")),(0,l.yg)("li",null,"Cleanup cluster registrations hook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1839654541","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1701","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1701/hovercard",href:"https://github.com/rancher/fleet/pull/1701"},"#1701"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.7.0...v0.7.1"},(0,l.yg)("tt",null,"v0.7.0...v0.7.1"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-crd-0.7.1.tgz"},"fleet-crd-0.7.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-agent-0.7.1.tgz"},"fleet-agent-0.7.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-0.7.1.tgz"},"fleet-0.7.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.7.1"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c1b42080.f25e3568.js b/assets/js/c1b42080.f25e3568.js deleted file mode 100644 index a41c90cff..000000000 --- a/assets/js/c1b42080.f25e3568.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5167],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(a),d=l,g=u["".concat(i,".").concat(d)]||u[d]||h[d]||n;return a?r.createElement(g,o(o({ref:t},p),{},{components:a})):r.createElement(g,o({ref:t},p))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=d;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:l,o[1]=s;for(var c=2;c{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.7.1",date:"2023-08-16 10:56:37 +0000 UTC"},o=void 0,s={unversionedId:"changelogs/changelogs/v0.7.1",id:"version-0.7/changelogs/changelogs/v0.7.1",title:"v0.7.1",description:"(rancherio-gh-m) released this 2023-08-16 1037 +0000 UTC",source:"@site/versioned_docs/version-0.7/changelogs/changelogs/v0.7.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.7.1",permalink:"/0.7/changelogs/changelogs/v0.7.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/changelogs/changelogs/v0.7.1.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.7.1",date:"2023-08-16 10:56:37 +0000 UTC"},sidebar:"docs",previous:{title:"v0.7.0",permalink:"/0.7/changelogs/changelogs/v0.7.0"}},i={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-08-16 10:56:37 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Helm release name fix by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1816053596","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1665","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1665/hovercard",href:"https://github.com/rancher/fleet/pull/1665"},"#1665")),(0,l.yg)("li",null,"Clean up cluster registrations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1815987464","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1664","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1664/hovercard",href:"https://github.com/rancher/fleet/pull/1664"},"#1664")," / ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1822066410","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1677","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1677/hovercard",href:"https://github.com/rancher/fleet/pull/1677"},"#1677")),(0,l.yg)("li",null,"Cleanup cluster registrations hook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1839654541","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1701","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1701/hovercard",href:"https://github.com/rancher/fleet/pull/1701"},"#1701"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.7.0...v0.7.1"},(0,l.yg)("tt",null,"v0.7.0...v0.7.1"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-crd-0.7.1.tgz"},"fleet-crd-0.7.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-agent-0.7.1.tgz"},"fleet-agent-0.7.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-0.7.1.tgz"},"fleet-0.7.1.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.7.1/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.7.1"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c1eb0b52.25853f9d.js b/assets/js/c1eb0b52.25853f9d.js deleted file mode 100644 index 8f6bebc96..000000000 --- a/assets/js/c1eb0b52.25853f9d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9937],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=a.createContext({}),s=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=s(n),g=l,f=p["".concat(c,".").concat(g)]||p[g]||m[g]||r;return n?a.createElement(f,i(i({ref:t},u),{},{components:n})):a.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=g;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[p]="string"==typeof e?e:l,i[1]=o;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>o,toc:()=>s});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.6/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.6/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.6/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-configuration.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.6/ref-registration"},next:{title:"Custom Resources Spec",permalink:"/0.6/ref-crds"}},c={},s=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2}],u={toc:s},p="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent "),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller ")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c1eb0b52.3aadb6fb.js b/assets/js/c1eb0b52.3aadb6fb.js new file mode 100644 index 000000000..3eb64fab6 --- /dev/null +++ b/assets/js/c1eb0b52.3aadb6fb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9937],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=a.createContext({}),s=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,c=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=s(n),g=l,f=p["".concat(c,".").concat(g)]||p[g]||m[g]||r;return n?a.createElement(f,i(i({ref:t},u),{},{components:n})):a.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=g;var o={};for(var c in t)hasOwnProperty.call(t,c)&&(o[c]=t[c]);o.originalType=e,o[p]="string"==typeof e?e:l,i[1]=o;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>o,toc:()=>s});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"version-0.6/ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/versioned_docs/version-0.6/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/0.6/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-configuration.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/0.6/ref-registration"},next:{title:"Custom Resources Spec",permalink:"/0.6/ref-crds"}},c={},s=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2}],u={toc:s},p="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crds/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/pkg/config/config.go#L40-L52"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent "),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller ")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused")),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c234ba49.769a2190.js b/assets/js/c234ba49.769a2190.js deleted file mode 100644 index 854c58217..000000000 --- a/assets/js/c234ba49.769a2190.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3547],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.9/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.9/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.9/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-bundle-stages.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.9/concepts"},next:{title:"Git Repository Contents",permalink:"/0.9/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.9/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.9/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.9/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/fe8cb35a.d6dd6984.js b/assets/js/c234ba49.b3a9f1c4.js similarity index 80% rename from assets/js/fe8cb35a.d6dd6984.js rename to assets/js/c234ba49.b3a9f1c4.js index 620992ebe..bd6fae6b5 100644 --- a/assets/js/fe8cb35a.d6dd6984.js +++ b/assets/js/c234ba49.b3a9f1c4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7060],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.7/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.7/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.7/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-bundle-stages.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.7/concepts"},next:{title:"Git Repository Contents",permalink:"/0.7/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.7/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.7/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.7/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3547],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.9/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.9/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.9/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-bundle-stages.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.9/concepts"},next:{title:"Git Repository Contents",permalink:"/0.9/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.9/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.9/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.9/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/c2bab82f.48e4aad3.js b/assets/js/c2bab82f.48e4aad3.js deleted file mode 100644 index 7b9ea0940..000000000 --- a/assets/js/c2bab82f.48e4aad3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6945],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5888:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.6/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.6/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.6/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/installation.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources",permalink:"/0.6/ref-resources"},next:{title:"Register Downstream Clusters",permalink:"/0.6/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e["v0.6"].kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},"First install the Fleet CustomResourcesDefintions.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.6"].fleetCRD),(0,l.yg)("p",null,"Second install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",r.e["v0.6"].fleet)),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA. ")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.6/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.6/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First install the Fleet CustomResourcesDefintions.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.6"].fleetCRD),(0,l.yg)("p",null,"Second install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e["v0.6"].fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.6/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/c2bab82f.b073e09f.js b/assets/js/c2bab82f.b073e09f.js new file mode 100644 index 000000000..313d16dec --- /dev/null +++ b/assets/js/c2bab82f.b073e09f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6945],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5888:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.6/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.6/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.6/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/installation.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources",permalink:"/0.6/ref-resources"},next:{title:"Register Downstream Clusters",permalink:"/0.6/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e["v0.6"].kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},"First install the Fleet CustomResourcesDefintions.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.6"].fleetCRD),(0,l.yg)("p",null,"Second install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",r.e["v0.6"].fleet)),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA. ")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.6/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.6/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First install the Fleet CustomResourcesDefintions.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e["v0.6"].fleetCRD),(0,l.yg)("p",null,"Second install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e["v0.6"].fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.6/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/c377a04b.3401eb9c.js b/assets/js/c377a04b.9b5d427f.js similarity index 53% rename from assets/js/c377a04b.3401eb9c.js rename to assets/js/c377a04b.9b5d427f.js index fd081b35b..f97b910d9 100644 --- a/assets/js/c377a04b.3401eb9c.js +++ b/assets/js/c377a04b.9b5d427f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5742],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,f=p["".concat(l,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"index",title:"Overview",description:"What is Fleet?",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/index.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function m(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}m.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5742],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,f=p["".concat(l,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"index",title:"Overview",description:"What is Fleet?",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/index.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function m(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}m.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file diff --git a/assets/js/c3dc158a.20e2d1b7.js b/assets/js/c3dc158a.20e2d1b7.js new file mode 100644 index 000000000..46d82c962 --- /dev/null +++ b/assets/js/c3dc158a.20e2d1b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3277],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(i.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),d=u(r),y=s,g=d["".concat(i,".").concat(y)]||d[y]||c[y]||l;return r?n.createElement(g,a(a({ref:t},p),{},{components:r})):n.createElement(g,a({ref:t},p))}));function g(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var l=r.length,a=new Array(l);a[0]=y;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[d]="string"==typeof e?e:s,a[1]=o;for(var u=2;u{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var n=r(8168),s=(r(6540),r(5680));const l={},a="Status Fields",o={unversionedId:"ref-status-fields",id:"ref-status-fields",title:"Status Fields",description:"Cluster and Bundle Display States",source:"@site/docs/ref-status-fields.md",sourceDirName:".",slug:"/ref-status-fields",permalink:"/ref-status-fields",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-status-fields.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleetcontroller gitjob",permalink:"/cli/fleet-controller/fleetcontroller_gitjob"},next:{title:"Cluster Registration Internals",permalink:"/ref-registration"}},i={},u=[{value:"Cluster and Bundle Display States",id:"cluster-and-bundle-display-states",level:2},{value:"Bundles",id:"bundles",level:3},{value:"Clusters",id:"clusters",level:3},{value:"GitRepo Conditions",id:"gitrepo-conditions",level:2},{value:"Resources List",id:"resources-list",level:2},{value:"Bundles",id:"bundles-1",level:3},{value:"GitRepos",id:"gitrepos",level:3},{value:"Resource Counts",id:"resource-counts",level:2},{value:"GitRepos",id:"gitrepos-1",level:3},{value:"Clusters",id:"clusters-1",level:3},{value:"ClusterGroups",id:"clustergroups",level:3}],p={toc:u},d="wrapper";function c(e){let{components:t,...l}=e;return(0,s.yg)(d,(0,n.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"status-fields"},"Status Fields"),(0,s.yg)("h2",{id:"cluster-and-bundle-display-states"},"Cluster and Bundle Display States"),(0,s.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,s.yg)("h3",{id:"bundles"},"Bundles"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,s.yg)("h3",{id:"clusters"},"Clusters"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."),(0,s.yg)("h2",{id:"gitrepo-conditions"},"GitRepo Conditions"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Ready"),":"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Active"),":"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Reconciling"),":"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Stalled"),": for errors"),(0,s.yg)("h2",{id:"resources-list"},"Resources List"),(0,s.yg)("p",null,"The resources lists contain the deployed resources, categorized under ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"."),(0,s.yg)("h3",{id:"bundles-1"},"Bundles"),(0,s.yg)("p",null,"The deployed resources within bundles can be found in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceKey"),". This key represents the actual resources deployed via ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h3",{id:"gitrepos"},"GitRepos"),(0,s.yg)("p",null,"Similar to bundles, the deployed resources in ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are listed in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.Resources"),". This list is also derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h2",{id:"resource-counts"},"Resource Counts"),(0,s.yg)("p",null,"This shows how resource counts are propagated from one resource to another:\n",(0,s.yg)("img",{alt:"Status Propagation",src:r(2334).A,width:"400",height:"642"})),(0,s.yg)("h3",{id:"gitrepos-1"},"GitRepos"),(0,s.yg)("p",null,"The ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list for GitRepos is derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h3",{id:"clusters-1"},"Clusters"),(0,s.yg)("p",null,"In Clusters, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is derived from GitRepos."),(0,s.yg)("h3",{id:"clustergroups"},"ClusterGroups"),(0,s.yg)("p",null,"In ClusterGroups, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is also derived from GitRepos."))}c.isMDXComponent=!0},2334:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetStatusSource-5cb28b2b4ac6f9cff9a9975f3c224292.png"}}]); \ No newline at end of file diff --git a/assets/js/c3dc158a.9e3b9ccf.js b/assets/js/c3dc158a.9e3b9ccf.js deleted file mode 100644 index 62406bcfc..000000000 --- a/assets/js/c3dc158a.9e3b9ccf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3277],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var i=n.createContext({}),u=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(i.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),d=u(r),y=s,g=d["".concat(i,".").concat(y)]||d[y]||c[y]||l;return r?n.createElement(g,a(a({ref:t},p),{},{components:r})):n.createElement(g,a({ref:t},p))}));function g(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var l=r.length,a=new Array(l);a[0]=y;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[d]="string"==typeof e?e:s,a[1]=o;for(var u=2;u{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var n=r(8168),s=(r(6540),r(5680));const l={},a="Status Fields",o={unversionedId:"ref-status-fields",id:"ref-status-fields",title:"Status Fields",description:"Cluster and Bundle Display States",source:"@site/docs/ref-status-fields.md",sourceDirName:".",slug:"/ref-status-fields",permalink:"/ref-status-fields",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-status-fields.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleetcontroller gitjob",permalink:"/cli/fleet-controller/fleetcontroller_gitjob"},next:{title:"Cluster Registration Internals",permalink:"/ref-registration"}},i={},u=[{value:"Cluster and Bundle Display States",id:"cluster-and-bundle-display-states",level:2},{value:"Bundles",id:"bundles",level:3},{value:"Clusters",id:"clusters",level:3},{value:"GitRepo Conditions",id:"gitrepo-conditions",level:2},{value:"Resources List",id:"resources-list",level:2},{value:"Bundles",id:"bundles-1",level:3},{value:"GitRepos",id:"gitrepos",level:3},{value:"Resource Counts",id:"resource-counts",level:2},{value:"GitRepos",id:"gitrepos-1",level:3},{value:"Clusters",id:"clusters-1",level:3},{value:"ClusterGroups",id:"clustergroups",level:3}],p={toc:u},d="wrapper";function c(e){let{components:t,...l}=e;return(0,s.yg)(d,(0,n.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"status-fields"},"Status Fields"),(0,s.yg)("h2",{id:"cluster-and-bundle-display-states"},"Cluster and Bundle Display States"),(0,s.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,s.yg)("h3",{id:"bundles"},"Bundles"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,s.yg)("h3",{id:"clusters"},"Clusters"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."),(0,s.yg)("h2",{id:"gitrepo-conditions"},"GitRepo Conditions"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Ready"),":"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Active"),":"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Reconciling"),":"),(0,s.yg)("p",null,(0,s.yg)("strong",{parentName:"p"},"Stalled"),": for errors"),(0,s.yg)("h2",{id:"resources-list"},"Resources List"),(0,s.yg)("p",null,"The resources lists contain the deployed resources, categorized under ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"."),(0,s.yg)("h3",{id:"bundles-1"},"Bundles"),(0,s.yg)("p",null,"The deployed resources within bundles can be found in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceKey"),". This key represents the actual resources deployed via ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h3",{id:"gitrepos"},"GitRepos"),(0,s.yg)("p",null,"Similar to bundles, the deployed resources in ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are listed in ",(0,s.yg)("inlineCode",{parentName:"p"},"status.Resources"),". This list is also derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h2",{id:"resource-counts"},"Resource Counts"),(0,s.yg)("p",null,"This shows how resource counts are propagated from one resource to another:\n",(0,s.yg)("img",{alt:"Status Propagation",src:r(2334).A,width:"400",height:"642"})),(0,s.yg)("h3",{id:"gitrepos-1"},"GitRepos"),(0,s.yg)("p",null,"The ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list for GitRepos is derived from ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleDeployments"),"."),(0,s.yg)("h3",{id:"clusters-1"},"Clusters"),(0,s.yg)("p",null,"In Clusters, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is derived from GitRepos."),(0,s.yg)("h3",{id:"clustergroups"},"ClusterGroups"),(0,s.yg)("p",null,"In ClusterGroups, the ",(0,s.yg)("inlineCode",{parentName:"p"},"status.ResourceCounts")," list is also derived from GitRepos."))}c.isMDXComponent=!0},2334:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetStatusSource-5cb28b2b4ac6f9cff9a9975f3c224292.png"}}]); \ No newline at end of file diff --git a/assets/js/c3dc2396.5ce1edd4.js b/assets/js/c3dc2396.d57094ed.js similarity index 64% rename from assets/js/c3dc2396.5ce1edd4.js rename to assets/js/c3dc2396.d57094ed.js index 36cfcb660..35c2d2347 100644 --- a/assets/js/c3dc2396.5ce1edd4.js +++ b/assets/js/c3dc2396.d57094ed.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5926],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>m});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=p(r),d=l,m=s["".concat(i,".").concat(d)]||s[d]||f[d]||o;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function m(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[s]="string"==typeof e?e:l,a[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller cleanup"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller_cleanup",id:"version-0.10/cli/fleet-controller/fleetcontroller_cleanup",title:"",description:"fleetcontroller cleanup",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_cleanup.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_cleanup",permalink:"/0.10/cli/fleet-controller/fleetcontroller_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_cleanup.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller cleanup"},sidebar:"docs",previous:{title:"fleetcontroller agentmanagement",permalink:"/0.10/cli/fleet-controller/fleetcontroller_agentmanagement"},next:{title:"Cluster and Bundle State",permalink:"/0.10/cluster-bundles-state"}},i={},p=[{value:"fleetcontroller cleanup",id:"fleetcontroller-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:p},s="wrapper";function f(e){let{components:t,...r}=e;return(0,l.yg)(s,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-cleanup"},"fleetcontroller cleanup"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller cleanup [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -h, --help help for cleanup\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5926],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>m});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=p(r),d=l,m=s["".concat(i,".").concat(d)]||s[d]||f[d]||o;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function m(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[s]="string"==typeof e?e:l,a[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleetcontroller cleanup"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller_cleanup",id:"version-0.10/cli/fleet-controller/fleetcontroller_cleanup",title:"",description:"fleetcontroller cleanup",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_cleanup.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_cleanup",permalink:"/0.10/cli/fleet-controller/fleetcontroller_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_cleanup.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller cleanup"},sidebar:"docs",previous:{title:"fleetcontroller agentmanagement",permalink:"/0.10/cli/fleet-controller/fleetcontroller_agentmanagement"},next:{title:"Cluster and Bundle State",permalink:"/0.10/cluster-bundles-state"}},i={},p=[{value:"fleetcontroller cleanup",id:"fleetcontroller-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],u={toc:p},s="wrapper";function f(e){let{components:t,...r}=e;return(0,l.yg)(s,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-cleanup"},"fleetcontroller cleanup"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller cleanup [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -h, --help help for cleanup\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c3dfc33d.2230eaf7.js b/assets/js/c3dfc33d.2230eaf7.js deleted file mode 100644 index 596a9de85..000000000 --- a/assets/js/c3dfc33d.2230eaf7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2312],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.7/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.7/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.7/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-cli/fleet_test.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.7/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.7/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/50b0676a.9fc2865f.js b/assets/js/c3dfc33d.83be11dc.js similarity index 80% rename from assets/js/50b0676a.9fc2865f.js rename to assets/js/c3dfc33d.83be11dc.js index 56830dc16..72241d53e 100644 --- a/assets/js/50b0676a.9fc2865f.js +++ b/assets/js/c3dfc33d.83be11dc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6452],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.8/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.8/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.8/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-cli/fleet_test.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.8/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.8/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2312],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,g=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"version-0.7/cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/versioned_docs/version-0.7/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/0.7/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-cli/fleet_test.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet apply",permalink:"/0.7/cli/fleet-cli/fleet_apply"},next:{title:"fleet-manager",permalink:"/0.7/cli/fleet-controller/fleet-manager"}},s={},c=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c67695e7.4f1d0191.js b/assets/js/c67695e7.ce05d240.js similarity index 78% rename from assets/js/c67695e7.4f1d0191.js rename to assets/js/c67695e7.ce05d240.js index 7495e076b..d4790f497 100644 --- a/assets/js/c67695e7.4f1d0191.js +++ b/assets/js/c67695e7.ce05d240.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5277],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,a(a({ref:t},u),{},{components:r})):n.createElement(y,a({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,a=new Array(s);a[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:o,a[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},a="Custom Resources During Deployment",i={unversionedId:"resources-during-deployment",id:"resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/docs/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/resources-during-deployment.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/namespaces"},next:{title:"Installation Details",permalink:"/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5277],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,a(a({ref:t},u),{},{components:r})):n.createElement(y,a({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,a=new Array(s);a[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:o,a[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},a="Custom Resources During Deployment",i={unversionedId:"resources-during-deployment",id:"resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/docs/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/resources-during-deployment.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/namespaces"},next:{title:"Installation Details",permalink:"/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file diff --git a/assets/js/c6aa770e.4202ec9b.js b/assets/js/c6aa770e.4202ec9b.js deleted file mode 100644 index e77e5f2c2..000000000 --- a/assets/js/c6aa770e.4202ec9b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4693],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.6/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.6/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.6/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/concepts.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.6/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.6/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.6/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.6/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.6/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c6aa770e.5f275bd1.js b/assets/js/c6aa770e.5f275bd1.js new file mode 100644 index 000000000..7c7c7828a --- /dev/null +++ b/assets/js/c6aa770e.5f275bd1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4693],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.6/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.6/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.6/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/concepts.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.6/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.6/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.6/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.6/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.6/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c7381d34.ab487e8b.js b/assets/js/c7381d34.ab487e8b.js deleted file mode 100644 index d913b56b3..000000000 --- a/assets/js/c7381d34.ab487e8b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8162],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>h});var o=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(s,".").concat(d)]||p[d]||g[d]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>g,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(8168),r=(n(6540),n(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/docs/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/webhook.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,o.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Azure DevOps, GitHub, GitLab, Bitbucket, Bitbucket Server, and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("p",null,"If you want to have the webhook available using the same host name as your Rancher or another service, you can use the following YAML with the URL ",(0,r.yg)("a",{parentName:"p",href:"http://your.domain.com/gitjob"},"http://your.domain.com/gitjob"),". The below YAML is specific for the Nginx Ingress Controller:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n annotations:\n nginx.ingress.kubernetes.io/use-regex: "true"\n nginx.ingress.kubernetes.io/rewrite-target: /$2\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /gitjob(/|$)(.*)\n pathType: ImplementationSpecific\n backend:\n service:\n name: gitjob\n port:\n number: 80\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-username"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-password"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("p",null,"For Azure DevOps:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Enable basic authentication in Azure"),(0,r.yg)("li",{parentName:"ul"},"Create a secret containing the credentials for the basic authentication")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}g.isMDXComponent=!0},4068:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/c7381d34.bc15fdb4.js b/assets/js/c7381d34.bc15fdb4.js new file mode 100644 index 000000000..53a42ad58 --- /dev/null +++ b/assets/js/c7381d34.bc15fdb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8162],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>h});var o=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(s,".").concat(d)]||p[d]||g[d]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>g,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(8168),r=(n(6540),n(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/docs/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/webhook.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,o.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Azure DevOps, GitHub, GitLab, Bitbucket, Bitbucket Server, and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("p",null,"If you want to have the webhook available using the same host name as your Rancher or another service, you can use the following YAML with the URL ",(0,r.yg)("a",{parentName:"p",href:"http://your.domain.com/gitjob"},"http://your.domain.com/gitjob"),". The below YAML is specific for the Nginx Ingress Controller:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n annotations:\n nginx.ingress.kubernetes.io/use-regex: "true"\n nginx.ingress.kubernetes.io/rewrite-target: /$2\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /gitjob(/|$)(.*)\n pathType: ImplementationSpecific\n backend:\n service:\n name: gitjob\n port:\n number: 80\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-username"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-password"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("p",null,"For Azure DevOps:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Enable basic authentication in Azure"),(0,r.yg)("li",{parentName:"ul"},"Create a secret containing the credentials for the basic authentication")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}g.isMDXComponent=!0},4068:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/c778489f.36c2cc19.js b/assets/js/c778489f.e90256ca.js similarity index 76% rename from assets/js/c778489f.36c2cc19.js rename to assets/js/c778489f.e90256ca.js index 08566bf74..7bb60652a 100644 --- a/assets/js/c778489f.36c2cc19.js +++ b/assets/js/c778489f.e90256ca.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6673],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),p=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(i.Provider,{value:t},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),g=p(n),f=a,y=g["".concat(i,".").concat(f)]||g[f]||u[f]||o;return n?r.createElement(y,l(l({ref:t},s),{},{components:n})):r.createElement(y,l({ref:t},s))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=f;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[g]="string"==typeof e?e:a,l[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var r=n(8168),a=(n(6540),n(5680));const o={title:"0.5 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.5/changelogs/index",title:"0.5 Changelogs",description:"* v0.5.3 (latest)",source:"@site/versioned_docs/version-0.5/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.5/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/index.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"0.5 Changelogs"}},i={},p=[],s={toc:p},g="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(g,(0,r.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.3"},"v0.5.3")," (latest)")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.2"},"v0.5.2")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.1"},"v0.5.1")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.0"},"v0.5.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6673],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),p=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(i.Provider,{value:t},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),g=p(n),f=a,y=g["".concat(i,".").concat(f)]||g[f]||u[f]||o;return n?r.createElement(y,l(l({ref:t},s),{},{components:n})):r.createElement(y,l({ref:t},s))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=f;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[g]="string"==typeof e?e:a,l[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var r=n(8168),a=(n(6540),n(5680));const o={title:"0.5 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.5/changelogs/index",title:"0.5 Changelogs",description:"* v0.5.3 (latest)",source:"@site/versioned_docs/version-0.5/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.5/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/index.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"0.5 Changelogs"}},i={},p=[],s={toc:p},g="wrapper";function u(e){let{components:t,...n}=e;return(0,a.yg)(g,(0,r.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.3"},"v0.5.3")," (latest)")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.2"},"v0.5.2")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.1"},"v0.5.1")," ")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/changelogs/changelogs/v0.5.0"},"v0.5.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c916adcd.ab227425.js b/assets/js/c916adcd.f5addf4e.js similarity index 61% rename from assets/js/c916adcd.ab227425.js rename to assets/js/c916adcd.f5addf4e.js index 1fda50a75..4012f5397 100644 --- a/assets/js/c916adcd.ab227425.js +++ b/assets/js/c916adcd.f5addf4e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[40],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},7932:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.7/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.7/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.7/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/quickstart.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.7/"},next:{title:"Creating a Deployment",permalink:"/0.7/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[40],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},7932:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.7/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.7/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.7/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/quickstart.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.7/"},next:{title:"Creating a Deployment",permalink:"/0.7/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/cce49c68.13e27c91.js b/assets/js/cce49c68.13e27c91.js new file mode 100644 index 000000000..57634c959 --- /dev/null +++ b/assets/js/cce49c68.13e27c91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2904],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,i=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(i,".").concat(p)]||h[p]||u[p]||n;return a?r.createElement(m,s(s({ref:t},d),{},{components:a})):r.createElement(m,s({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,s=new Array(n);s[0]=p;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[h]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>n,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.5.3",date:"2023-03-06 15:56:56 +0000 UTC"},s=void 0,o={unversionedId:"changelogs/changelogs/v0.5.3",id:"version-0.5/changelogs/changelogs/v0.5.3",title:"v0.5.3",description:"(rancherio-gh-m) released this 2023-03-06 1556 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.3.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.3",permalink:"/0.5/changelogs/changelogs/v0.5.3",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.3.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.5.3",date:"2023-03-06 15:56:56 +0000 UTC"},sidebar:"docs",previous:{title:"v0.5.2",permalink:"/0.5/changelogs/changelogs/v0.5.2"}},i={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-03-06 15:56:56 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade."),(0,l.yg)("p",null,"When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from fleet-system to cattle-fleet-system. This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover fleet-system namespaces. In older versions of fleet, it's possible to ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1528099306","data-permission-text":"Title is private","data-url":"https://github.com/rancher/rancher/issues/40127","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard?comment_id=1379027121&comment_type=issue_comment",href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1379027121"},"rancher/rancher#40127 (comment)")," into the new namespace, or to ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1528099306","data-permission-text":"Title is private","data-url":"https://github.com/rancher/rancher/issues/40127","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard?comment_id=1381884485&comment_type=issue_comment",href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1381884485"},"rancher/rancher#40127 (comment)"),"."),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,'Backport "Reading contents&secrets uses specific service account" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1566163652","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1298","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1298/hovercard",href:"https://github.com/rancher/fleet/pull/1298"},"#1298"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Disable Gitops Feature Breaks Fleet Controller Deployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1502700385","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1195","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1195/hovercard",href:"https://github.com/rancher/fleet/pull/1195"},"#1195")),(0,l.yg)("li",null,"Add emptyDir volume to Fleet controller for /tmp by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504797073","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1202","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1202/hovercard",href:"https://github.com/rancher/fleet/pull/1202"},"#1202")),(0,l.yg)("li",null,"Do not fail on missing labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1548776358","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1261","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1261/hovercard",href:"https://github.com/rancher/fleet/pull/1261"},"#1261")),(0,l.yg)("li",null,"Fix Rancher upgrade by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1556869984","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1275","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1275/hovercard",href:"https://github.com/rancher/fleet/pull/1275"},"#1275")),(0,l.yg)("li",null,"Long release names shorten once by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557863677","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1279","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1279/hovercard",href:"https://github.com/rancher/fleet/pull/1279"},"#1279")),(0,l.yg)("li",null,"Fix agent not starting in fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1585833920","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1322","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1322/hovercard",href:"https://github.com/rancher/fleet/pull/1322"},"#1322")),(0,l.yg)("li",null,"Ensure valid release name for agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1604909749","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1356","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1356/hovercard",href:"https://github.com/rancher/fleet/pull/1356"},"#1356"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Update GitHub actions in release v0.5 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1455076517","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1107","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1107/hovercard",href:"https://github.com/rancher/fleet/pull/1107"},"#1107")),(0,l.yg)("li",null,"Bump bci images in release/v0.5 branch by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1530498191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1241","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1241/hovercard",href:"https://github.com/rancher/fleet/pull/1241"},"#1241")),(0,l.yg)("li",null,"Backport fix Windows 1809 builds on Drone by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1534752776","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1250","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1250/hovercard",href:"https://github.com/rancher/fleet/pull/1250"},"#1250")),(0,l.yg)("li",null,"Go dependencies and SLE-BCI bumps by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/macedogm/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/macedogm"},"@macedogm")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1535699592","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1255","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1255/hovercard",href:"https://github.com/rancher/fleet/pull/1255"},"#1255")),(0,l.yg)("li",null,"Bump gitjob to 0.1.36 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557022079","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1276","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1276/hovercard",href:"https://github.com/rancher/fleet/pull/1276"},"#1276"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.5.3"},(0,l.yg)("tt",null,"v0.5.0...v0.5.3"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"fleet-crd-0.5.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz"},"fleet-agent-0.5.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz"},"fleet-0.5.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.3"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cce49c68.90201edf.js b/assets/js/cce49c68.90201edf.js deleted file mode 100644 index 46db73bbb..000000000 --- a/assets/js/cce49c68.90201edf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2904],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,i=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(i,".").concat(p)]||h[p]||u[p]||n;return a?r.createElement(m,s(s({ref:t},d),{},{components:a})):r.createElement(m,s({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,s=new Array(n);s[0]=p;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[h]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>n,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.5.3",date:"2023-03-06 15:56:56 +0000 UTC"},s=void 0,o={unversionedId:"changelogs/changelogs/v0.5.3",id:"version-0.5/changelogs/changelogs/v0.5.3",title:"v0.5.3",description:"(rancherio-gh-m) released this 2023-03-06 1556 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.3.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.3",permalink:"/0.5/changelogs/changelogs/v0.5.3",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.3.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.5.3",date:"2023-03-06 15:56:56 +0000 UTC"},sidebar:"docs",previous:{title:"v0.5.2",permalink:"/0.5/changelogs/changelogs/v0.5.2"}},i={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-03-06 15:56:56 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"Upgrading the Fleet helm chart upgrades the fleet-controller and its config. To avoid race conditions while fleet-controller starts updating the fleet-agents, we propose to scale down the fleet-controller to zero replicas before starting the upgrade."),(0,l.yg)("p",null,"When using Fleet in Rancher and updating from Rancher 2.5, the default installation namespace for fleet changes from fleet-system to cattle-fleet-system. This release adds code to re-deploy the agents if necessary, to regenerate their config in the new namespace. Once the new agent is running and the cluster resources status is ok, it's fine to delete any leftover fleet-system namespaces. In older versions of fleet, it's possible to ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1528099306","data-permission-text":"Title is private","data-url":"https://github.com/rancher/rancher/issues/40127","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard?comment_id=1379027121&comment_type=issue_comment",href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1379027121"},"rancher/rancher#40127 (comment)")," into the new namespace, or to ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1528099306","data-permission-text":"Title is private","data-url":"https://github.com/rancher/rancher/issues/40127","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/40127/hovercard?comment_id=1381884485&comment_type=issue_comment",href:"https://github.com/rancher/rancher/issues/40127#issuecomment-1381884485"},"rancher/rancher#40127 (comment)"),"."),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,'Backport "Reading contents&secrets uses specific service account" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1566163652","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1298","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1298/hovercard",href:"https://github.com/rancher/fleet/pull/1298"},"#1298"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Disable Gitops Feature Breaks Fleet Controller Deployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1502700385","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1195","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1195/hovercard",href:"https://github.com/rancher/fleet/pull/1195"},"#1195")),(0,l.yg)("li",null,"Add emptyDir volume to Fleet controller for /tmp by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504797073","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1202","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1202/hovercard",href:"https://github.com/rancher/fleet/pull/1202"},"#1202")),(0,l.yg)("li",null,"Do not fail on missing labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1548776358","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1261","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1261/hovercard",href:"https://github.com/rancher/fleet/pull/1261"},"#1261")),(0,l.yg)("li",null,"Fix Rancher upgrade by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1556869984","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1275","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1275/hovercard",href:"https://github.com/rancher/fleet/pull/1275"},"#1275")),(0,l.yg)("li",null,"Long release names shorten once by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557863677","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1279","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1279/hovercard",href:"https://github.com/rancher/fleet/pull/1279"},"#1279")),(0,l.yg)("li",null,"Fix agent not starting in fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1585833920","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1322","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1322/hovercard",href:"https://github.com/rancher/fleet/pull/1322"},"#1322")),(0,l.yg)("li",null,"Ensure valid release name for agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1604909749","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1356","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1356/hovercard",href:"https://github.com/rancher/fleet/pull/1356"},"#1356"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Update GitHub actions in release v0.5 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1455076517","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1107","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1107/hovercard",href:"https://github.com/rancher/fleet/pull/1107"},"#1107")),(0,l.yg)("li",null,"Bump bci images in release/v0.5 branch by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1530498191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1241","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1241/hovercard",href:"https://github.com/rancher/fleet/pull/1241"},"#1241")),(0,l.yg)("li",null,"Backport fix Windows 1809 builds on Drone by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1534752776","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1250","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1250/hovercard",href:"https://github.com/rancher/fleet/pull/1250"},"#1250")),(0,l.yg)("li",null,"Go dependencies and SLE-BCI bumps by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/macedogm/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/macedogm"},"@macedogm")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1535699592","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1255","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1255/hovercard",href:"https://github.com/rancher/fleet/pull/1255"},"#1255")),(0,l.yg)("li",null,"Bump gitjob to 0.1.36 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557022079","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1276","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1276/hovercard",href:"https://github.com/rancher/fleet/pull/1276"},"#1276"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.5.3"},(0,l.yg)("tt",null,"v0.5.0...v0.5.3"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"fleet-crd-0.5.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz"},"fleet-agent-0.5.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz"},"fleet-0.5.3.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.3"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd0bf424.0a6d877a.js b/assets/js/cd0bf424.0a6d877a.js new file mode 100644 index 000000000..0e0f950b7 --- /dev/null +++ b/assets/js/cd0bf424.0a6d877a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8016],{5680:(e,t,l)=>{l.d(t,{xA:()=>u,yg:()=>m});var n=l(6540);function r(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function s(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,n)}return l}function a(e){for(var t=1;t=0||(r[l]=e[l]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var i=n.createContext({}),c=function(e){var t=n.useContext(i),l=t;return e&&(l="function"==typeof e?e(t):a(a({},t),e)),l},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var l=e.components,r=e.mdxType,s=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(l),g=r,m=p["".concat(i,".").concat(g)]||p[g]||d[g]||s;return l?n.createElement(m,a(a({ref:t},u),{},{components:l})):n.createElement(m,a({ref:t},u))}));function m(e,t){var l=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=l.length,a=new Array(s);a[0]=g;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[p]="string"==typeof e?e:r,a[1]=o;for(var c=2;c{l.r(t),l.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var n=l(8168),r=(l(6540),l(5680));const s={},a="Single Cluster Install",o={unversionedId:"single-cluster-install",id:"version-0.4/single-cluster-install",title:"Single Cluster Install",description:"In this use case you have only one cluster. The cluster will run both the Fleet",source:"@site/versioned_docs/version-0.4/single-cluster-install.md",sourceDirName:".",slug:"/single-cluster-install",permalink:"/0.4/single-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/single-cluster-install.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation",permalink:"/0.4/installation"},next:{title:"Multi-cluster Install",permalink:"/0.4/multi-cluster-install"}},i={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"Install",id:"install",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...s}=e;return(0,r.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"single-cluster-install"},"Single Cluster Install"),(0,r.yg)("p",null,(0,r.yg)("img",{src:l(2614).A,width:"520",height:"279"})),(0,r.yg)("p",null,"In this use case you have only one cluster. The cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,r.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,r.yg)("h3",{id:"helm-3"},"Helm 3"),(0,r.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,r.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,r.yg)("p",null,"macOS"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,r.yg)("p",null,"Windows"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,r.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,r.yg)("p",null,"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the\nsingle cluster use case you will install Fleet to the cluster which you intend to manage with GitOps.\nAny Kubernetes community supported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,r.yg)("h2",{id:"install"},"Install"),(0,r.yg)("p",null,"Install the following two Helm charts."),(0,r.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz\n")),(0,r.yg)("p",null,"Second install the Fleet controllers."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz\n")),(0,r.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,r.yg)("p",null,"You can now ",(0,r.yg)("a",{parentName:"p",href:"/0.4/gitrepo-add"},"register some git repos")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."))}d.isMDXComponent=!0},2614:(e,t,l)=>{l.d(t,{A:()=>n});const n=l.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/cd0bf424.25a59026.js b/assets/js/cd0bf424.25a59026.js deleted file mode 100644 index 72b509cd8..000000000 --- a/assets/js/cd0bf424.25a59026.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8016],{5680:(e,t,l)=>{l.d(t,{xA:()=>u,yg:()=>m});var n=l(6540);function r(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function s(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,n)}return l}function a(e){for(var t=1;t=0||(r[l]=e[l]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var i=n.createContext({}),c=function(e){var t=n.useContext(i),l=t;return e&&(l="function"==typeof e?e(t):a(a({},t),e)),l},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var l=e.components,r=e.mdxType,s=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(l),g=r,m=p["".concat(i,".").concat(g)]||p[g]||d[g]||s;return l?n.createElement(m,a(a({ref:t},u),{},{components:l})):n.createElement(m,a({ref:t},u))}));function m(e,t){var l=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=l.length,a=new Array(s);a[0]=g;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[p]="string"==typeof e?e:r,a[1]=o;for(var c=2;c{l.r(t),l.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var n=l(8168),r=(l(6540),l(5680));const s={},a="Single Cluster Install",o={unversionedId:"single-cluster-install",id:"version-0.4/single-cluster-install",title:"Single Cluster Install",description:"In this use case you have only one cluster. The cluster will run both the Fleet",source:"@site/versioned_docs/version-0.4/single-cluster-install.md",sourceDirName:".",slug:"/single-cluster-install",permalink:"/0.4/single-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/single-cluster-install.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation",permalink:"/0.4/installation"},next:{title:"Multi-cluster Install",permalink:"/0.4/multi-cluster-install"}},i={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"Install",id:"install",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...s}=e;return(0,r.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"single-cluster-install"},"Single Cluster Install"),(0,r.yg)("p",null,(0,r.yg)("img",{src:l(2614).A,width:"520",height:"279"})),(0,r.yg)("p",null,"In this use case you have only one cluster. The cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,r.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,r.yg)("h3",{id:"helm-3"},"Helm 3"),(0,r.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,r.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,r.yg)("p",null,"macOS"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,r.yg)("p",null,"Windows"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,r.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,r.yg)("p",null,"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the\nsingle cluster use case you will install Fleet to the cluster which you intend to manage with GitOps.\nAny Kubernetes community supported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,r.yg)("h2",{id:"install"},"Install"),(0,r.yg)("p",null,"Install the following two Helm charts."),(0,r.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-crd-0.4.1.tgz\n")),(0,r.yg)("p",null,"Second install the Fleet controllers."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-0.4.1.tgz\n")),(0,r.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,r.yg)("p",null,"You can now ",(0,r.yg)("a",{parentName:"p",href:"/0.4/gitrepo-add"},"register some git repos")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."))}d.isMDXComponent=!0},2614:(e,t,l)=>{l.d(t,{A:()=>n});const n=l.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/cd323ffc.376b6fd7.js b/assets/js/cd323ffc.376b6fd7.js new file mode 100644 index 000000000..4a8e2aeb9 --- /dev/null +++ b/assets/js/cd323ffc.376b6fd7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2439],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/docs/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/imagescan.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/webhook"},next:{title:"Create a Bundle Resource",permalink:"/bundle-add"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},'Semver will ignore pre-release versions (for example, 0.0.1-10) unless a pre-release version is explicitly used in the range definition.\nFor example, the "*" range will ignore pre-releases while ">= 0.0.1-10" will take them into account.')),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd323ffc.4cb1c396.js b/assets/js/cd323ffc.4cb1c396.js deleted file mode 100644 index a00194c0e..000000000 --- a/assets/js/cd323ffc.4cb1c396.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2439],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/docs/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/imagescan.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/webhook"},next:{title:"Create a Bundle Resource",permalink:"/bundle-add"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},'Semver will ignore pre-release versions (for example, 0.0.1-10) unless a pre-release version is explicitly used in the range definition.\nFor example, the "*" range will ignore pre-releases while ">= 0.0.1-10" will take them into account.')),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd3b874c.4e2537a2.js b/assets/js/cd3b874c.4e2537a2.js deleted file mode 100644 index 666529050..000000000 --- a/assets/js/cd3b874c.4e2537a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4537],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=o,m=p["".concat(s,".").concat(d)]||p[d]||h[d]||l;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Architecture",i={unversionedId:"architecture",id:"version-0.10/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet controller and the cluster agents. These",source:"@site/versioned_docs/version-0.10/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.10/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/architecture.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.10/uninstall"},next:{title:"Core Concepts",permalink:"/0.10/concepts"}},s={},c=[{value:"Fleet Controller",id:"fleet-controller",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...l}=e;return(0,o.yg)(p,(0,r.A)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"architecture"},"Architecture"),(0,o.yg)("p",null,"Fleet has two primary components. The Fleet controller and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet controller will pull from git and the\ncluster agents will pull from the Fleet controller."),(0,o.yg)("h2",{id:"fleet-controller"},"Fleet Controller"),(0,o.yg)("p",null,"The Fleet controller is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet controller is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,o.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,o.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet controller.\nThe only communication from cluster to Fleet controller is by this agent and all communication\ngoes from the managed cluster to the Fleet controller. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet controller. The one exception to this is if you use\nthe ",(0,o.yg)("a",{parentName:"p",href:"/0.10/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,o.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,o.yg)("h2",{id:"security"},"Security"),(0,o.yg)("p",null,'The Fleet controller dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,o.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,o.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,o.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,o.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,o.yg)("h2",{id:"component-overview"},"Component Overview"),(0,o.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/cd3b874c.d4ee4213.js b/assets/js/cd3b874c.d4ee4213.js new file mode 100644 index 000000000..acea3da4e --- /dev/null +++ b/assets/js/cd3b874c.d4ee4213.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4537],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=o,m=p["".concat(s,".").concat(d)]||p[d]||h[d]||l;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Architecture",i={unversionedId:"architecture",id:"version-0.10/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet controller and the cluster agents. These",source:"@site/versioned_docs/version-0.10/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.10/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/architecture.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.10/uninstall"},next:{title:"Core Concepts",permalink:"/0.10/concepts"}},s={},c=[{value:"Fleet Controller",id:"fleet-controller",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...l}=e;return(0,o.yg)(p,(0,r.A)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"architecture"},"Architecture"),(0,o.yg)("p",null,"Fleet has two primary components. The Fleet controller and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet controller will pull from git and the\ncluster agents will pull from the Fleet controller."),(0,o.yg)("h2",{id:"fleet-controller"},"Fleet Controller"),(0,o.yg)("p",null,"The Fleet controller is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet controller is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,o.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,o.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet controller.\nThe only communication from cluster to Fleet controller is by this agent and all communication\ngoes from the managed cluster to the Fleet controller. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet controller. The one exception to this is if you use\nthe ",(0,o.yg)("a",{parentName:"p",href:"/0.10/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,o.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,o.yg)("h2",{id:"security"},"Security"),(0,o.yg)("p",null,'The Fleet controller dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,o.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,o.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,o.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,o.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,o.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,o.yg)("h2",{id:"component-overview"},"Component Overview"),(0,o.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/cd5efc4d.7e4a0f06.js b/assets/js/cd5efc4d.7e4a0f06.js deleted file mode 100644 index 2e126dda9..000000000 --- a/assets/js/cd5efc4d.7e4a0f06.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4665],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),d=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=d(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),p=d(r),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return r?n.createElement(g,s(s({ref:t},i),{},{components:r})):n.createElement(g,s({ref:t},i))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var d=2;d{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var n=r(8168),a=(r(6540),r(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.10/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.10/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.10/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cluster-bundles-state.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleetcontroller cleanup",permalink:"/0.10/cli/fleet-controller/fleetcontroller_cleanup"},next:{title:"Resources List",permalink:"/0.10/resource-counts-and-resources-list"}},u={},d=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],i={toc:d},p="wrapper";function c(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cd5efc4d.aa9e9158.js b/assets/js/cd5efc4d.aa9e9158.js new file mode 100644 index 000000000..81ca8eca7 --- /dev/null +++ b/assets/js/cd5efc4d.aa9e9158.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4665],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>g});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),d=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=d(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),p=d(r),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return r?n.createElement(g,s(s({ref:t},i),{},{components:r})):n.createElement(g,s({ref:t},i))}));function g(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var d=2;d{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var n=r(8168),a=(r(6540),r(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.10/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.10/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.10/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cluster-bundles-state.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleetcontroller cleanup",permalink:"/0.10/cli/fleet-controller/fleetcontroller_cleanup"},next:{title:"Resources List",permalink:"/0.10/resource-counts-and-resources-list"}},u={},d=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],i={toc:d},p="wrapper";function c(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce48e831.17531819.js b/assets/js/ce48e831.17531819.js new file mode 100644 index 000000000..aac66e47c --- /dev/null +++ b/assets/js/ce48e831.17531819.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7452],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.7/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.7/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.7/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/concepts.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.7/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.7/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.7/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.7/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.7/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce48e831.6c875db7.js b/assets/js/ce48e831.6c875db7.js deleted file mode 100644 index 0dd76731a..000000000 --- a/assets/js/ce48e831.6c875db7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7452],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.7/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.7/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.7/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/concepts.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.7/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.7/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.7/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.7/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.7/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce534227.030fd894.js b/assets/js/ce534227.030fd894.js new file mode 100644 index 000000000..a0b380391 --- /dev/null +++ b/assets/js/ce534227.030fd894.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8720],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>h});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),d=o,h=u["".concat(c,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(h,s(s({ref:t},p),{},{components:n})):r.createElement(h,s({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.6/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.6/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.6/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-gitrepo.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.6/ref-fleet-yaml"},next:{title:"Troubleshooting",permalink:"/0.6/troubleshooting"}},c={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n # \n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression. \n # Credentials will always be used if it is empty or not provided\n # \n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ce534227.f2af98c0.js b/assets/js/ce534227.f2af98c0.js deleted file mode 100644 index 5d4cba266..000000000 --- a/assets/js/ce534227.f2af98c0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8720],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>h});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),l=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=l(n),d=o,h=u["".concat(c,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(h,s(s({ref:t},p),{},{components:n})):r.createElement(h,s({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var r=n(8168),o=(n(6540),n(5680));const a={},s="GitRepo Resource",i={unversionedId:"ref-gitrepo",id:"version-0.6/ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/versioned_docs/version-0.6/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/0.6/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-gitrepo.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/0.6/ref-fleet-yaml"},next:{title:"Troubleshooting",permalink:"/0.6/troubleshooting"}},c={},l=[],p={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/0.6/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private registry you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n #\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n # \n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression. \n # Credentials will always be used if it is empty or not provided\n # \n # helmRepoURLRegex: https://charts.rancher.io/*\n #\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n #\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n #\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cf6f5f9b.066b6e0a.js b/assets/js/cf6f5f9b.066b6e0a.js new file mode 100644 index 000000000..b76a5eb70 --- /dev/null +++ b/assets/js/cf6f5f9b.066b6e0a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4044],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.7/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.7/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.7/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/architecture.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.7/uninstall"},next:{title:"Core Concepts",permalink:"/0.7/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.7/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/d0180ce2.a210270a.js b/assets/js/d0180ce2.a210270a.js new file mode 100644 index 000000000..76d983cf4 --- /dev/null +++ b/assets/js/d0180ce2.a210270a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9894],{5680:(e,t,a)=>{a.d(t,{xA:()=>y,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},y=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,y=i(e,["components","mdxType","originalType","parentName"]),m=u(a),d=l,o=m["".concat(p,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},y),{},{components:a})):n.createElement(o,g({ref:t},y))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.9/ref-crds",title:"Custom Resources Spec",description:"* Bundle",source:"@site/versioned_docs/version-0.9/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.9/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-crds.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/0.9/ref-resources"},next:{title:"fleet.yaml",permalink:"/0.9/ref-fleet-yaml"}},p={},u=[{value:"Bundle",id:"bundle",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"Content",id:"content",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"FleetYAML",id:"fleetyaml",level:4},{value:"ImageScanYAML",id:"imagescanyaml",level:4}],y={toc:u},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},y,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#fleetyaml"},"FleetYAML")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanyaml"},"ImageScanYAML"))),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters."),(0,l.yg)("p",null,"When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteCRDResources"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDNS"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to ",(0,l.yg)("inlineCode",{parentName:"td"},"true")," by default."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"skipSchemaValidation"),(0,l.yg)("td",{parentName:"tr",align:null},"SkipSchemaValidation allows skipping schema validation against the chart values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNodes is the number of nodes that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes is the number of nodes that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes contains the names of ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyNodes is a string in the form \\"%d/%d\\", that describes the number of nodes that are ready vs. the number of expected nodes.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null},"SampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecretNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTLSMode"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTLSMode supports two values: ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store")," and ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),". If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store"),", instructs the agent to trust CA bundles from the operating system's store. If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),", then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last gitjob run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last GitJob run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"fleetyaml"},"FleetYAML"),(0,l.yg)("p",null,"FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle which will be created."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"labels"),(0,l.yg)("td",{parentName:"tr",align:null},"Labels are copied to the bundle and can be used in a dependsOn.selector."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetCustomizations"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScans"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScans are optional and used to update container image references in the git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescanyaml"},"ImageScanYAML")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overrideTargets"),(0,l.yg)("td",{parentName:"tr",align:null},"OverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanyaml"},"ImageScanYAML"),(0,l.yg)("p",null,"ImageScanYAML is a single entry in the ImageScan list from fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the image scan. Unused."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d0180ce2.c2646e02.js b/assets/js/d0180ce2.c2646e02.js deleted file mode 100644 index 3f11cbf75..000000000 --- a/assets/js/d0180ce2.c2646e02.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9894],{5680:(e,t,a)=>{a.d(t,{xA:()=>y,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},y=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,y=i(e,["components","mdxType","originalType","parentName"]),m=u(a),d=l,o=m["".concat(p,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},y),{},{components:a})):n.createElement(o,g({ref:t},y))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.9/ref-crds",title:"Custom Resources Spec",description:"* Bundle",source:"@site/versioned_docs/version-0.9/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.9/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-crds.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/0.9/ref-resources"},next:{title:"fleet.yaml",permalink:"/0.9/ref-fleet-yaml"}},p={},u=[{value:"Bundle",id:"bundle",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"Content",id:"content",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"FleetYAML",id:"fleetyaml",level:4},{value:"ImageScanYAML",id:"imagescanyaml",level:4}],y={toc:u},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},y,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#fleetyaml"},"FleetYAML")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanyaml"},"ImageScanYAML"))),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters."),(0,l.yg)("p",null,"When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"*map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteCRDResources"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDNS"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to ",(0,l.yg)("inlineCode",{parentName:"td"},"true")," by default."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"skipSchemaValidation"),(0,l.yg)("td",{parentName:"tr",align:null},"SkipSchemaValidation allows skipping schema validation against the chart values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNodes is the number of nodes that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes is the number of nodes that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyNode contains the names of non-ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyNodes contains the names of ready nodes. The list is limited to at most 3 names."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyNodes is a string in the form \\"%d/%d\\", that describes the number of nodes that are ready vs. the number of expected nodes.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null},"SampleNode is the name of one of the nodes that are ready. If no node is ready, it's the name of a node that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecretNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTLSMode"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTLSMode supports two values: ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store")," and ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),". If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store"),", instructs the agent to trust CA bundles from the operating system's store. If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),", then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last gitjob run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last GitJob run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"fleetyaml"},"FleetYAML"),(0,l.yg)("p",null,"FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle which will be created."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"labels"),(0,l.yg)("td",{parentName:"tr",align:null},"Labels are copied to the bundle and can be used in a dependsOn.selector."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetCustomizations"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScans"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScans are optional and used to update container image references in the git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescanyaml"},"ImageScanYAML")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overrideTargets"),(0,l.yg)("td",{parentName:"tr",align:null},"OverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanyaml"},"ImageScanYAML"),(0,l.yg)("p",null,"ImageScanYAML is a single entry in the ImageScan list from fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the image scan. Unused."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d0436963.4800e890.js b/assets/js/d0436963.c72b3711.js similarity index 82% rename from assets/js/d0436963.4800e890.js rename to assets/js/d0436963.c72b3711.js index 6002e3a03..b833c68e2 100644 --- a/assets/js/d0436963.4800e890.js +++ b/assets/js/d0436963.c72b3711.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2042],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),g=s(r),f=o,d=g["".concat(i,".").concat(f)]||g[f]||u[f]||a;return r?n.createElement(d,c(c({ref:t},p),{},{components:r})):n.createElement(d,c({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=f;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[g]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.7 Changelogs"},c=void 0,l={unversionedId:"changelogs/index",id:"version-0.7/changelogs/index",title:"0.7 Changelogs",description:"* v0.7.1 (latest)",source:"@site/versioned_docs/version-0.7/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.7/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/changelogs/index.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"0.7 Changelogs"}},i={},s=[],p={toc:s},g="wrapper";function u(e){let{components:t,...r}=e;return(0,o.yg)(g,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.7/changelogs/changelogs/v0.7.1"},"v0.7.1")," (latest)")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.7/changelogs/changelogs/v0.7.0"},"v0.7.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2042],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),g=s(r),f=o,d=g["".concat(i,".").concat(f)]||g[f]||u[f]||a;return r?n.createElement(d,c(c({ref:t},p),{},{components:r})):n.createElement(d,c({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=f;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[g]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.7 Changelogs"},c=void 0,l={unversionedId:"changelogs/index",id:"version-0.7/changelogs/index",title:"0.7 Changelogs",description:"* v0.7.1 (latest)",source:"@site/versioned_docs/version-0.7/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.7/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/changelogs/index.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"0.7 Changelogs"}},i={},s=[],p={toc:s},g="wrapper";function u(e){let{components:t,...r}=e;return(0,o.yg)(g,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.7/changelogs/changelogs/v0.7.1"},"v0.7.1")," (latest)")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.7/changelogs/changelogs/v0.7.0"},"v0.7.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d254ed97.b749d91e.js b/assets/js/d254ed97.b749d91e.js deleted file mode 100644 index 5c923db93..000000000 --- a/assets/js/d254ed97.b749d91e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9073],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),c=s(a),u=n,h=c["".concat(p,".").concat(u)]||c[u]||m[u]||l;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,o[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.5.1",date:"2023-01-23 14:09:59 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.5.1",id:"version-0.5/changelogs/changelogs/v0.5.1",title:"v0.5.1",description:"(rancherio-gh-m) released this 2023-01-23 1459 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.1",permalink:"/0.5/changelogs/changelogs/v0.5.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.1.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.5.1",date:"2023-01-23 14:09:59 +0000 UTC"},sidebar:"docs",previous:{title:"v0.5.0",permalink:"/0.5/changelogs/changelogs/v0.5.0"},next:{title:"v0.5.2",permalink:"/0.5/changelogs/changelogs/v0.5.2"}},p={},s=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:s},c="wrapper";function m(e){let{components:t,...a}=e;return(0,n.yg)(c,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-01-23 14:09:59 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Fix git validation problem in wrangler")),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.5.1"},(0,n.yg)("tt",null,"v0.5.0...v0.5.1"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-crd-0.5.1.tgz"},"fleet-crd-0.5.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-agent-0.5.1.tgz"},"fleet-agent-0.5.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-0.5.1.tgz"},"fleet-0.5.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-linux-s390x"},"fleet-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.1"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d254ed97.e56d43ab.js b/assets/js/d254ed97.e56d43ab.js new file mode 100644 index 000000000..861ec9fde --- /dev/null +++ b/assets/js/d254ed97.e56d43ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9073],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),c=s(a),u=n,h=c["".concat(p,".").concat(u)]||c[u]||m[u]||l;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,o[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.5.1",date:"2023-01-23 14:09:59 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.5.1",id:"version-0.5/changelogs/changelogs/v0.5.1",title:"v0.5.1",description:"(rancherio-gh-m) released this 2023-01-23 1459 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.1",permalink:"/0.5/changelogs/changelogs/v0.5.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.1.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.5.1",date:"2023-01-23 14:09:59 +0000 UTC"},sidebar:"docs",previous:{title:"v0.5.0",permalink:"/0.5/changelogs/changelogs/v0.5.0"},next:{title:"v0.5.2",permalink:"/0.5/changelogs/changelogs/v0.5.2"}},p={},s=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:s},c="wrapper";function m(e){let{components:t,...a}=e;return(0,n.yg)(c,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-01-23 14:09:59 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Fix git validation problem in wrangler")),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.5.1"},(0,n.yg)("tt",null,"v0.5.0...v0.5.1"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-crd-0.5.1.tgz"},"fleet-crd-0.5.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-agent-0.5.1.tgz"},"fleet-agent-0.5.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-0.5.1.tgz"},"fleet-0.5.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-linux-s390x"},"fleet-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.1/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.1"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d26595bf.0d18e311.js b/assets/js/d26595bf.0d18e311.js deleted file mode 100644 index 5b7cb93d6..000000000 --- a/assets/js/d26595bf.0d18e311.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2640],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var n in t)hasOwnProperty.call(t,n)&&(o[n]=t[n]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.8.0",date:"2023-09-11 15:05:53 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.8.0",id:"version-0.8/changelogs/changelogs/v0.8.0",title:"v0.8.0",description:"(rancherio-gh-m) released this 2023-09-11 1553 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.0",permalink:"/0.8/changelogs/changelogs/v0.8.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.0.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.8.0",date:"2023-09-11 15:05:53 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.8/troubleshooting"},next:{title:"v0.8.1",permalink:"/0.8/changelogs/changelogs/v0.8.1"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-09-11 15:05:53 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h1",null,"Notes on 0.8.0"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Allow helm credentials to be defined for each path by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1727085185","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1557","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1557/hovercard",href:"https://github.com/rancher/fleet/pull/1557"},"#1557")),(0,l.yg)("li",null,"Add cluster name and namespace to BundleDeployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736703491","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1571","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1571/hovercard",href:"https://github.com/rancher/fleet/pull/1571"},"#1571")),(0,l.yg)("li",null,"Add DoNotDeploy and OverrideTargets by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1742026878","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1580","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1580/hovercard",href:"https://github.com/rancher/fleet/pull/1580"},"#1580")),(0,l.yg)("li",null,"Drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1760099815","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1594","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1594/hovercard",href:"https://github.com/rancher/fleet/pull/1594"},"#1594")),(0,l.yg)("li",null,"Add helm release resources to bd status by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1760832327","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1596","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1596/hovercard",href:"https://github.com/rancher/fleet/pull/1596"},"#1596")),(0,l.yg)("li",null,"Add NamespaceLabels and NamespaceAnnotations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1786451555","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1627","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1627/hovercard",href:"https://github.com/rancher/fleet/pull/1627"},"#1627")),(0,l.yg)("li",null,"Support exclusion of files and directories from bundles via ",(0,l.yg)("code",null,".fleetignore")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1789222079","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1634","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1634/hovercard",href:"https://github.com/rancher/fleet/pull/1634"},"#1634")),(0,l.yg)("li",null,"Add hook on upgrade to clean up old, duplicate clusterregistrations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1831523656","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1689","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1689/hovercard",href:"https://github.com/rancher/fleet/pull/1689"},"#1689"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Cleanup command takes string durations as arguments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1836935733","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1697","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1697/hovercard",href:"https://github.com/rancher/fleet/pull/1697"},"#1697")))),(0,l.yg)("li",null,"Clean up old clusterregistrations and remember cluster's api server by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1813740722","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1658","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1658/hovercard",href:"https://github.com/rancher/fleet/pull/1658"},"#1658"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Clusteregistration less aggressive cleanup by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1820301580","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1675","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1675/hovercard",href:"https://github.com/rancher/fleet/pull/1675"},"#1675")),(0,l.yg)("li",null,"Return early from clusterregistration handler by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1821988540","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1676","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1676/hovercard",href:"https://github.com/rancher/fleet/pull/1676"},"#1676")))),(0,l.yg)("li",null,"Restrict registration to leader agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1830725807","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1687","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1687/hovercard",href:"https://github.com/rancher/fleet/pull/1687"},"#1687")),(0,l.yg)("li",null,"Do not restart agents when adopting them with a bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1824265931","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1678","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1678/hovercard",href:"https://github.com/rancher/fleet/pull/1678"},"#1678"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Agent registration recovery by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736435720","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1567","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1567/hovercard",href:"https://github.com/rancher/fleet/pull/1567"},"#1567")),(0,l.yg)("li",null,"Use correct string comparison in gitjob update script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1765567189","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1610","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1610/hovercard",href:"https://github.com/rancher/fleet/pull/1610"},"#1610")),(0,l.yg)("li",null,"Reduce Helm history to two entries by default by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1763288512","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1607","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1607/hovercard",href:"https://github.com/rancher/fleet/pull/1607"},"#1607")),(0,l.yg)("li",null,"Fix Helm release name generation to prevent double dashes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1800340686","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1647","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1647/hovercard",href:"https://github.com/rancher/fleet/pull/1647"},"#1647")),(0,l.yg)("li",null,"Prevent non-hex chars in release name hash by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1801057525","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1649","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1649/hovercard",href:"https://github.com/rancher/fleet/pull/1649"},"#1649")),(0,l.yg)("li",null,"Enforce strict match on cluster name when fetching bundledeployments by cluster by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1815877612","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1662","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1662/hovercard",href:"https://github.com/rancher/fleet/pull/1662"},"#1662"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Adapt e2e tests for local infra setup tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1793202710","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1638","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1638/hovercard",href:"https://github.com/rancher/fleet/pull/1638"},"#1638")),(0,l.yg)("li",null,"Add CONTRIBUTING.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/kkaempf/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/kkaempf"},"@kkaempf")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1700435199","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1517","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1517/hovercard",href:"https://github.com/rancher/fleet/pull/1517"},"#1517")),(0,l.yg)("li",null,"Add GitRepo e2e test case involving auth to a local Helm registry by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1754951261","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1591","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1591/hovercard",href:"https://github.com/rancher/fleet/pull/1591"},"#1591")),(0,l.yg)("li",null,"Add end-to-end tests for Helm auth with HTTP by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1769095254","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1613","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1613/hovercard",href:"https://github.com/rancher/fleet/pull/1613"},"#1613")),(0,l.yg)("li",null,"Add webhook-based gitrepo test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736472732","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1568","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1568/hovercard",href:"https://github.com/rancher/fleet/pull/1568"},"#1568")),(0,l.yg)("li",null,"Bump Gitjob chart to 0.1.76 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1859325560","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1729","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1729/hovercard",href:"https://github.com/rancher/fleet/pull/1729"},"#1729")),(0,l.yg)("li",null,"Do not indent release.yaml entries by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1828612133","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1686","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1686/hovercard",href:"https://github.com/rancher/fleet/pull/1686"},"#1686")),(0,l.yg)("li",null,"Fix e2e tests requiring secrets by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1774322432","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1619","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1619/hovercard",href:"https://github.com/rancher/fleet/pull/1619"},"#1619")),(0,l.yg)("li",null,"Fix linting errors by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1809551397","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1655","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1655/hovercard",href:"https://github.com/rancher/fleet/pull/1655"},"#1655")),(0,l.yg)("li",null,"Fix release against charts repo script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1769659094","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1614","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1614/hovercard",href:"https://github.com/rancher/fleet/pull/1614"},"#1614")),(0,l.yg)("li",null,"Go K8s related security bumps backport by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1846650979","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1710","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1710/hovercard",href:"https://github.com/rancher/fleet/pull/1710"},"#1710")),(0,l.yg)("li",null,"Install ",(0,l.yg)("code",null,"tar")," in linux-amd64/fossa Drone CI pipeline by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1741303954","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1578","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1578/hovercard",href:"https://github.com/rancher/fleet/pull/1578"},"#1578")),(0,l.yg)("li",null,"Migrate e2e tests to local git server by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1733659980","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1563","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1563/hovercard",href:"https://github.com/rancher/fleet/pull/1563"},"#1563")),(0,l.yg)("li",null,"Only replace the Chart version during release by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1759128522","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1593","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1593/hovercard",href:"https://github.com/rancher/fleet/pull/1593"},"#1593")),(0,l.yg)("li",null,"Provide README.mds for all Fleet helm-charts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1762784106","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1598","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1598/hovercard",href:"https://github.com/rancher/fleet/pull/1598"},"#1598")),(0,l.yg)("li",null,"Provide path to relevant directory when building git server image for nightly CI workflow by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1798449455","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1646","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1646/hovercard",href:"https://github.com/rancher/fleet/pull/1646"},"#1646")),(0,l.yg)("li",null,"Refactor target match packages by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1756526990","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1592","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1592/hovercard",href:"https://github.com/rancher/fleet/pull/1592"},"#1592")),(0,l.yg)("li",null,"Refactorings registration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736603398","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1570","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1570/hovercard",href:"https://github.com/rancher/fleet/pull/1570"},"#1570")),(0,l.yg)("li",null,"Remove k8s 1.20 from PR CI matrix by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1824489430","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1680","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1680/hovercard",href:"https://github.com/rancher/fleet/pull/1680"},"#1680")),(0,l.yg)("li",null,"Remove rancher/qa mention from PR template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1789292000","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1635","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1635/hovercard",href:"https://github.com/rancher/fleet/pull/1635"},"#1635")),(0,l.yg)("li",null,'Remove schedule run for "Upgrade Fleet in Rancher to Latest Release CI" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1738184347","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1573","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1573/hovercard",href:"https://github.com/rancher/fleet/pull/1573"},"#1573")),(0,l.yg)("li",null,"Replace 3rd party action with native CLI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancher-security-bot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancher-security-bot"},"@rancher-security-bot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1787273210","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1628","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1628/hovercard",href:"https://github.com/rancher/fleet/pull/1628"},"#1628")),(0,l.yg)("li",null,"Restructure package layout to add internal package by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1781051757","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1624","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1624/hovercard",href:"https://github.com/rancher/fleet/pull/1624"},"#1624")),(0,l.yg)("li",null,"Split test images from fleet images dev script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1767710221","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1612","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1612/hovercard",href:"https://github.com/rancher/fleet/pull/1612"},"#1612")),(0,l.yg)("li",null,"Test for DependsOn by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1779054939","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1623","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1623/hovercard",href:"https://github.com/rancher/fleet/pull/1623"},"#1623")),(0,l.yg)("li",null,"Unpin ginkgo version installed in CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1774342641","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1620","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1620/hovercard",href:"https://github.com/rancher/fleet/pull/1620"},"#1620")),(0,l.yg)("li",null,"Update README.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/andriisoldatenko/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/andriisoldatenko"},"@andriisoldatenko")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1721693997","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1550","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1550/hovercard",href:"https://github.com/rancher/fleet/pull/1550"},"#1550")),(0,l.yg)("li",null,"Update README.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1760241049","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1595","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1595/hovercard",href:"https://github.com/rancher/fleet/pull/1595"},"#1595")),(0,l.yg)("li",null,"Update release doc for updating Fleet components by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1774423872","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1621","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1621/hovercard",href:"https://github.com/rancher/fleet/pull/1621"},"#1621")),(0,l.yg)("li",null,"Use separate gitrepo resource for test case requiring secret by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1785783453","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1626","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1626/hovercard",href:"https://github.com/rancher/fleet/pull/1626"},"#1626")),(0,l.yg)("li",null,"build(deps): bump bci/bci-base from 15.5.36.5.21 to 15.5.36.5.25 in /\u2026 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1859072014","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1727","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1727/hovercard",href:"https://github.com/rancher/fleet/pull/1727"},"#1727")),(0,l.yg)("li",null,"build(deps): bump github.com/go-git/go-git/v5 from 5.8.0 to 5.8.1 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1828450988","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1683","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1683/hovercard",href:"https://github.com/rancher/fleet/pull/1683"},"#1683")),(0,l.yg)("li",null,"build(deps): bump github.com/hashicorp/go-getter from 1.7.1 to 1.7.2 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1828451199","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1684","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1684/hovercard",href:"https://github.com/rancher/fleet/pull/1684"},"#1684"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.7.1...v0.8.0"},(0,l.yg)("tt",null,"v0.7.1...v0.8.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-linux-s390x"},"fleet-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-crd-0.8.0.tgz"},"fleet-crd-0.8.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-agent-0.8.0.tgz"},"fleet-agent-0.8.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-0.8.0.tgz"},"fleet-0.8.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d26595bf.c76f1ac2.js b/assets/js/d26595bf.c76f1ac2.js new file mode 100644 index 000000000..2f8a3282b --- /dev/null +++ b/assets/js/d26595bf.c76f1ac2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2640],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var n in t)hasOwnProperty.call(t,n)&&(o[n]=t[n]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.8.0",date:"2023-09-11 15:05:53 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.8.0",id:"version-0.8/changelogs/changelogs/v0.8.0",title:"v0.8.0",description:"(rancherio-gh-m) released this 2023-09-11 1553 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.0",permalink:"/0.8/changelogs/changelogs/v0.8.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.0.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.8.0",date:"2023-09-11 15:05:53 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.8/troubleshooting"},next:{title:"v0.8.1",permalink:"/0.8/changelogs/changelogs/v0.8.1"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-09-11 15:05:53 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h1",null,"Notes on 0.8.0"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Allow helm credentials to be defined for each path by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1727085185","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1557","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1557/hovercard",href:"https://github.com/rancher/fleet/pull/1557"},"#1557")),(0,l.yg)("li",null,"Add cluster name and namespace to BundleDeployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736703491","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1571","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1571/hovercard",href:"https://github.com/rancher/fleet/pull/1571"},"#1571")),(0,l.yg)("li",null,"Add DoNotDeploy and OverrideTargets by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1742026878","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1580","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1580/hovercard",href:"https://github.com/rancher/fleet/pull/1580"},"#1580")),(0,l.yg)("li",null,"Drift correction by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1760099815","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1594","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1594/hovercard",href:"https://github.com/rancher/fleet/pull/1594"},"#1594")),(0,l.yg)("li",null,"Add helm release resources to bd status by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1760832327","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1596","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1596/hovercard",href:"https://github.com/rancher/fleet/pull/1596"},"#1596")),(0,l.yg)("li",null,"Add NamespaceLabels and NamespaceAnnotations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1786451555","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1627","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1627/hovercard",href:"https://github.com/rancher/fleet/pull/1627"},"#1627")),(0,l.yg)("li",null,"Support exclusion of files and directories from bundles via ",(0,l.yg)("code",null,".fleetignore")," by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1789222079","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1634","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1634/hovercard",href:"https://github.com/rancher/fleet/pull/1634"},"#1634")),(0,l.yg)("li",null,"Add hook on upgrade to clean up old, duplicate clusterregistrations by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1831523656","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1689","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1689/hovercard",href:"https://github.com/rancher/fleet/pull/1689"},"#1689"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Cleanup command takes string durations as arguments by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1836935733","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1697","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1697/hovercard",href:"https://github.com/rancher/fleet/pull/1697"},"#1697")))),(0,l.yg)("li",null,"Clean up old clusterregistrations and remember cluster's api server by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1813740722","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1658","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1658/hovercard",href:"https://github.com/rancher/fleet/pull/1658"},"#1658"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Clusteregistration less aggressive cleanup by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1820301580","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1675","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1675/hovercard",href:"https://github.com/rancher/fleet/pull/1675"},"#1675")),(0,l.yg)("li",null,"Return early from clusterregistration handler by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1821988540","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1676","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1676/hovercard",href:"https://github.com/rancher/fleet/pull/1676"},"#1676")))),(0,l.yg)("li",null,"Restrict registration to leader agent by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1830725807","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1687","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1687/hovercard",href:"https://github.com/rancher/fleet/pull/1687"},"#1687")),(0,l.yg)("li",null,"Do not restart agents when adopting them with a bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1824265931","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1678","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1678/hovercard",href:"https://github.com/rancher/fleet/pull/1678"},"#1678"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Agent registration recovery by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736435720","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1567","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1567/hovercard",href:"https://github.com/rancher/fleet/pull/1567"},"#1567")),(0,l.yg)("li",null,"Use correct string comparison in gitjob update script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1765567189","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1610","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1610/hovercard",href:"https://github.com/rancher/fleet/pull/1610"},"#1610")),(0,l.yg)("li",null,"Reduce Helm history to two entries by default by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/moio/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/moio"},"@moio")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1763288512","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1607","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1607/hovercard",href:"https://github.com/rancher/fleet/pull/1607"},"#1607")),(0,l.yg)("li",null,"Fix Helm release name generation to prevent double dashes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1800340686","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1647","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1647/hovercard",href:"https://github.com/rancher/fleet/pull/1647"},"#1647")),(0,l.yg)("li",null,"Prevent non-hex chars in release name hash by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1801057525","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1649","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1649/hovercard",href:"https://github.com/rancher/fleet/pull/1649"},"#1649")),(0,l.yg)("li",null,"Enforce strict match on cluster name when fetching bundledeployments by cluster by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1815877612","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1662","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1662/hovercard",href:"https://github.com/rancher/fleet/pull/1662"},"#1662"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Adapt e2e tests for local infra setup tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1793202710","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1638","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1638/hovercard",href:"https://github.com/rancher/fleet/pull/1638"},"#1638")),(0,l.yg)("li",null,"Add CONTRIBUTING.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/kkaempf/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/kkaempf"},"@kkaempf")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1700435199","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1517","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1517/hovercard",href:"https://github.com/rancher/fleet/pull/1517"},"#1517")),(0,l.yg)("li",null,"Add GitRepo e2e test case involving auth to a local Helm registry by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1754951261","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1591","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1591/hovercard",href:"https://github.com/rancher/fleet/pull/1591"},"#1591")),(0,l.yg)("li",null,"Add end-to-end tests for Helm auth with HTTP by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1769095254","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1613","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1613/hovercard",href:"https://github.com/rancher/fleet/pull/1613"},"#1613")),(0,l.yg)("li",null,"Add webhook-based gitrepo test by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736472732","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1568","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1568/hovercard",href:"https://github.com/rancher/fleet/pull/1568"},"#1568")),(0,l.yg)("li",null,"Bump Gitjob chart to 0.1.76 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1859325560","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1729","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1729/hovercard",href:"https://github.com/rancher/fleet/pull/1729"},"#1729")),(0,l.yg)("li",null,"Do not indent release.yaml entries by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1828612133","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1686","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1686/hovercard",href:"https://github.com/rancher/fleet/pull/1686"},"#1686")),(0,l.yg)("li",null,"Fix e2e tests requiring secrets by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1774322432","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1619","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1619/hovercard",href:"https://github.com/rancher/fleet/pull/1619"},"#1619")),(0,l.yg)("li",null,"Fix linting errors by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1809551397","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1655","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1655/hovercard",href:"https://github.com/rancher/fleet/pull/1655"},"#1655")),(0,l.yg)("li",null,"Fix release against charts repo script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1769659094","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1614","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1614/hovercard",href:"https://github.com/rancher/fleet/pull/1614"},"#1614")),(0,l.yg)("li",null,"Go K8s related security bumps backport by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1846650979","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1710","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1710/hovercard",href:"https://github.com/rancher/fleet/pull/1710"},"#1710")),(0,l.yg)("li",null,"Install ",(0,l.yg)("code",null,"tar")," in linux-amd64/fossa Drone CI pipeline by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1741303954","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1578","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1578/hovercard",href:"https://github.com/rancher/fleet/pull/1578"},"#1578")),(0,l.yg)("li",null,"Migrate e2e tests to local git server by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1733659980","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1563","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1563/hovercard",href:"https://github.com/rancher/fleet/pull/1563"},"#1563")),(0,l.yg)("li",null,"Only replace the Chart version during release by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1759128522","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1593","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1593/hovercard",href:"https://github.com/rancher/fleet/pull/1593"},"#1593")),(0,l.yg)("li",null,"Provide README.mds for all Fleet helm-charts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1762784106","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1598","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1598/hovercard",href:"https://github.com/rancher/fleet/pull/1598"},"#1598")),(0,l.yg)("li",null,"Provide path to relevant directory when building git server image for nightly CI workflow by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1798449455","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1646","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1646/hovercard",href:"https://github.com/rancher/fleet/pull/1646"},"#1646")),(0,l.yg)("li",null,"Refactor target match packages by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1756526990","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1592","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1592/hovercard",href:"https://github.com/rancher/fleet/pull/1592"},"#1592")),(0,l.yg)("li",null,"Refactorings registration by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1736603398","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1570","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1570/hovercard",href:"https://github.com/rancher/fleet/pull/1570"},"#1570")),(0,l.yg)("li",null,"Remove k8s 1.20 from PR CI matrix by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1824489430","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1680","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1680/hovercard",href:"https://github.com/rancher/fleet/pull/1680"},"#1680")),(0,l.yg)("li",null,"Remove rancher/qa mention from PR template by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1789292000","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1635","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1635/hovercard",href:"https://github.com/rancher/fleet/pull/1635"},"#1635")),(0,l.yg)("li",null,'Remove schedule run for "Upgrade Fleet in Rancher to Latest Release CI" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1738184347","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1573","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1573/hovercard",href:"https://github.com/rancher/fleet/pull/1573"},"#1573")),(0,l.yg)("li",null,"Replace 3rd party action with native CLI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancher-security-bot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancher-security-bot"},"@rancher-security-bot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1787273210","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1628","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1628/hovercard",href:"https://github.com/rancher/fleet/pull/1628"},"#1628")),(0,l.yg)("li",null,"Restructure package layout to add internal package by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1781051757","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1624","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1624/hovercard",href:"https://github.com/rancher/fleet/pull/1624"},"#1624")),(0,l.yg)("li",null,"Split test images from fleet images dev script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1767710221","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1612","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1612/hovercard",href:"https://github.com/rancher/fleet/pull/1612"},"#1612")),(0,l.yg)("li",null,"Test for DependsOn by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1779054939","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1623","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1623/hovercard",href:"https://github.com/rancher/fleet/pull/1623"},"#1623")),(0,l.yg)("li",null,"Unpin ginkgo version installed in CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1774342641","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1620","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1620/hovercard",href:"https://github.com/rancher/fleet/pull/1620"},"#1620")),(0,l.yg)("li",null,"Update README.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/andriisoldatenko/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/andriisoldatenko"},"@andriisoldatenko")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1721693997","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1550","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1550/hovercard",href:"https://github.com/rancher/fleet/pull/1550"},"#1550")),(0,l.yg)("li",null,"Update README.md by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1760241049","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1595","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1595/hovercard",href:"https://github.com/rancher/fleet/pull/1595"},"#1595")),(0,l.yg)("li",null,"Update release doc for updating Fleet components by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1774423872","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1621","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1621/hovercard",href:"https://github.com/rancher/fleet/pull/1621"},"#1621")),(0,l.yg)("li",null,"Use separate gitrepo resource for test case requiring secret by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1785783453","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1626","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1626/hovercard",href:"https://github.com/rancher/fleet/pull/1626"},"#1626")),(0,l.yg)("li",null,"build(deps): bump bci/bci-base from 15.5.36.5.21 to 15.5.36.5.25 in /\u2026 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1859072014","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1727","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1727/hovercard",href:"https://github.com/rancher/fleet/pull/1727"},"#1727")),(0,l.yg)("li",null,"build(deps): bump github.com/go-git/go-git/v5 from 5.8.0 to 5.8.1 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1828450988","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1683","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1683/hovercard",href:"https://github.com/rancher/fleet/pull/1683"},"#1683")),(0,l.yg)("li",null,"build(deps): bump github.com/hashicorp/go-getter from 1.7.1 to 1.7.2 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1828451199","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1684","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1684/hovercard",href:"https://github.com/rancher/fleet/pull/1684"},"#1684"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.7.1...v0.8.0"},(0,l.yg)("tt",null,"v0.7.1...v0.8.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-linux-s390x"},"fleet-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-crd-0.8.0.tgz"},"fleet-crd-0.8.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-agent-0.8.0.tgz"},"fleet-agent-0.8.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-0.8.0.tgz"},"fleet-0.8.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.0/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d277059e.13e4ce80.js b/assets/js/d277059e.13e4ce80.js deleted file mode 100644 index 0b2d501d6..000000000 --- a/assets/js/d277059e.13e4ce80.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3860],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,m=f["".concat(s,".").concat(d)]||f[d]||u[d]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.7/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.7/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.7/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.7/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.7/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -h, --help help for apply\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d277059e.86bdab2a.js b/assets/js/d277059e.86bdab2a.js new file mode 100644 index 000000000..68bf77e47 --- /dev/null +++ b/assets/js/d277059e.86bdab2a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3860],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,m=f["".concat(s,".").concat(d)]||f[d]||u[d]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.7/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.7/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.7/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.7/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.7/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -h, --help help for apply\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d2e22918.c7b606f9.js b/assets/js/d2e22918.e7ea188a.js similarity index 91% rename from assets/js/d2e22918.c7b606f9.js rename to assets/js/d2e22918.e7ea188a.js index 0e0f76e8b..891ffafa4 100644 --- a/assets/js/d2e22918.c7b606f9.js +++ b/assets/js/d2e22918.e7ea188a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6124],{5680:(e,r,t)=>{t.d(r,{xA:()=>l,yg:()=>m});var n=t(6540);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var u=n.createContext({}),i=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},l=function(e){var r=i(e.components);return n.createElement(u.Provider,{value:r},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,u=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),p=i(t),d=o,m=p["".concat(u,".").concat(d)]||p[d]||f[d]||c;return t?n.createElement(m,s(s({ref:r},l),{},{components:t})):n.createElement(m,s({ref:r},l))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,s=new Array(c);s[0]=d;var a={};for(var u in r)hasOwnProperty.call(r,u)&&(a[u]=r[u]);a.originalType=e,a[p]="string"==typeof e?e:o,s[1]=a;for(var i=2;i{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>c,metadata:()=>a,toc:()=>i});var n=t(8168),o=(t(6540),t(5680));const c={},s=void 0,a={unversionedId:"resource-counts-and-resources-list",id:"resource-counts-and-resources-list",title:"resource-counts-and-resources-list",description:"",source:"@site/docs/resource-counts-and-resources-list.md",sourceDirName:".",slug:"/resource-counts-and-resources-list",permalink:"/resource-counts-and-resources-list",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/resource-counts-and-resources-list.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{}},u={},i=[],l={toc:i},p="wrapper";function f(e){let{components:r,...t}=e;return(0,o.yg)(p,(0,n.A)({},l,t,{components:r,mdxType:"MDXLayout"}))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6124],{5680:(e,r,t)=>{t.d(r,{xA:()=>l,yg:()=>m});var n=t(6540);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var u=n.createContext({}),i=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},l=function(e){var r=i(e.components);return n.createElement(u.Provider,{value:r},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,u=e.parentName,l=a(e,["components","mdxType","originalType","parentName"]),p=i(t),d=o,m=p["".concat(u,".").concat(d)]||p[d]||f[d]||c;return t?n.createElement(m,s(s({ref:r},l),{},{components:t})):n.createElement(m,s({ref:r},l))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,s=new Array(c);s[0]=d;var a={};for(var u in r)hasOwnProperty.call(r,u)&&(a[u]=r[u]);a.originalType=e,a[p]="string"==typeof e?e:o,s[1]=a;for(var i=2;i{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>c,metadata:()=>a,toc:()=>i});var n=t(8168),o=(t(6540),t(5680));const c={},s=void 0,a={unversionedId:"resource-counts-and-resources-list",id:"resource-counts-and-resources-list",title:"resource-counts-and-resources-list",description:"",source:"@site/docs/resource-counts-and-resources-list.md",sourceDirName:".",slug:"/resource-counts-and-resources-list",permalink:"/resource-counts-and-resources-list",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/resource-counts-and-resources-list.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{}},u={},i=[],l={toc:i},p="wrapper";function f(e){let{components:r,...t}=e;return(0,o.yg)(p,(0,n.A)({},l,t,{components:r,mdxType:"MDXLayout"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d362fc0b.1f6f5b96.js b/assets/js/d362fc0b.1f6f5b96.js deleted file mode 100644 index 1617abdab..000000000 --- a/assets/js/d362fc0b.1f6f5b96.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3795],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,i=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,g=h["".concat(i,".").concat(p)]||h[p]||u[p]||n;return a?r.createElement(g,s(s({ref:t},d),{},{components:a})):r.createElement(g,s({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,s=new Array(n);s[0]=p;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[h]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>n,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.5.2",date:"2023-02-23 08:01:03 +0000 UTC"},s=void 0,o={unversionedId:"changelogs/changelogs/v0.5.2",id:"version-0.5/changelogs/changelogs/v0.5.2",title:"v0.5.2",description:"(rancherio-gh-m) released this 2023-02-23 0803 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.2.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.2",permalink:"/0.5/changelogs/changelogs/v0.5.2",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.2.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.5.2",date:"2023-02-23 08:01:03 +0000 UTC"},sidebar:"docs",previous:{title:"v0.5.1",permalink:"/0.5/changelogs/changelogs/v0.5.1"},next:{title:"v0.5.3",permalink:"/0.5/changelogs/changelogs/v0.5.3"}},i={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-02-23 08:01:03 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Disable Gitops Feature Breaks Fleet Controller Deployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1502700385","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1195","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1195/hovercard",href:"https://github.com/rancher/fleet/pull/1195"},"#1195")),(0,l.yg)("li",null,"Add emptyDir volume to Fleet controller for /tmp by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504797073","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1202","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1202/hovercard",href:"https://github.com/rancher/fleet/pull/1202"},"#1202")),(0,l.yg)("li",null,"Bump bci images in release/v0.5 branch by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1530498191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1241","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1241/hovercard",href:"https://github.com/rancher/fleet/pull/1241"},"#1241")),(0,l.yg)("li",null,"Go dependencies and SLE-BCI bumps by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/macedogm/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/macedogm"},"@macedogm")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1535699592","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1255","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1255/hovercard",href:"https://github.com/rancher/fleet/pull/1255"},"#1255")),(0,l.yg)("li",null,"Do not fail on missing labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1548776358","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1261","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1261/hovercard",href:"https://github.com/rancher/fleet/pull/1261"},"#1261")),(0,l.yg)("li",null,"Fix Rancher upgrade by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1556869984","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1275","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1275/hovercard",href:"https://github.com/rancher/fleet/pull/1275"},"#1275")),(0,l.yg)("li",null,"Bump gitjob to 0.1.36 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557022079","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1276","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1276/hovercard",href:"https://github.com/rancher/fleet/pull/1276"},"#1276")),(0,l.yg)("li",null,"Long release names shorten once by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557863677","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1279","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1279/hovercard",href:"https://github.com/rancher/fleet/pull/1279"},"#1279")),(0,l.yg)("li",null,'Backport "Reading contents&secrets uses specific service account" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1566163652","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1298","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1298/hovercard",href:"https://github.com/rancher/fleet/pull/1298"},"#1298")),(0,l.yg)("li",null,"Fix agent not starting in fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1585833920","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1322","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1322/hovercard",href:"https://github.com/rancher/fleet/pull/1322"},"#1322"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.5.2"},(0,l.yg)("tt",null,"v0.5.0...v0.5.2"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-crd-0.5.2.tgz"},"fleet-crd-0.5.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-agent-0.5.2.tgz"},"fleet-agent-0.5.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-0.5.2.tgz"},"fleet-0.5.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.2"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d362fc0b.be9ece68.js b/assets/js/d362fc0b.be9ece68.js new file mode 100644 index 000000000..dc1384c22 --- /dev/null +++ b/assets/js/d362fc0b.be9ece68.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3795],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function s(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var i=r.createContext({}),c=function(e){var t=r.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,i=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,g=h["".concat(i,".").concat(p)]||h[p]||u[p]||n;return a?r.createElement(g,s(s({ref:t},d),{},{components:a})):r.createElement(g,s({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,s=new Array(n);s[0]=p;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[h]="string"==typeof e?e:l,s[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>u,frontMatter:()=>n,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.5.2",date:"2023-02-23 08:01:03 +0000 UTC"},s=void 0,o={unversionedId:"changelogs/changelogs/v0.5.2",id:"version-0.5/changelogs/changelogs/v0.5.2",title:"v0.5.2",description:"(rancherio-gh-m) released this 2023-02-23 0803 +0000 UTC",source:"@site/versioned_docs/version-0.5/changelogs/changelogs/v0.5.2.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.5.2",permalink:"/0.5/changelogs/changelogs/v0.5.2",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/changelogs/changelogs/v0.5.2.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.5.2",date:"2023-02-23 08:01:03 +0000 UTC"},sidebar:"docs",previous:{title:"v0.5.1",permalink:"/0.5/changelogs/changelogs/v0.5.1"},next:{title:"v0.5.3",permalink:"/0.5/changelogs/changelogs/v0.5.3"}},i={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-02-23 08:01:03 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Disable Gitops Feature Breaks Fleet Controller Deployment by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1502700385","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1195","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1195/hovercard",href:"https://github.com/rancher/fleet/pull/1195"},"#1195")),(0,l.yg)("li",null,"Add emptyDir volume to Fleet controller for /tmp by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1504797073","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1202","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1202/hovercard",href:"https://github.com/rancher/fleet/pull/1202"},"#1202")),(0,l.yg)("li",null,"Bump bci images in release/v0.5 branch by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1530498191","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1241","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1241/hovercard",href:"https://github.com/rancher/fleet/pull/1241"},"#1241")),(0,l.yg)("li",null,"Go dependencies and SLE-BCI bumps by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/macedogm/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/macedogm"},"@macedogm")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1535699592","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1255","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1255/hovercard",href:"https://github.com/rancher/fleet/pull/1255"},"#1255")),(0,l.yg)("li",null,"Do not fail on missing labels by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1548776358","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1261","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1261/hovercard",href:"https://github.com/rancher/fleet/pull/1261"},"#1261")),(0,l.yg)("li",null,"Fix Rancher upgrade by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1556869984","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1275","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1275/hovercard",href:"https://github.com/rancher/fleet/pull/1275"},"#1275")),(0,l.yg)("li",null,"Bump gitjob to 0.1.36 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557022079","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1276","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1276/hovercard",href:"https://github.com/rancher/fleet/pull/1276"},"#1276")),(0,l.yg)("li",null,"Long release names shorten once by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1557863677","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1279","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1279/hovercard",href:"https://github.com/rancher/fleet/pull/1279"},"#1279")),(0,l.yg)("li",null,'Backport "Reading contents&secrets uses specific service account" by ',(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1566163652","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1298","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1298/hovercard",href:"https://github.com/rancher/fleet/pull/1298"},"#1298")),(0,l.yg)("li",null,"Fix agent not starting in fleet-system namespace by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1585833920","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1322","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1322/hovercard",href:"https://github.com/rancher/fleet/pull/1322"},"#1322"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.5.0...v0.5.2"},(0,l.yg)("tt",null,"v0.5.0...v0.5.2"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-crd-0.5.2.tgz"},"fleet-crd-0.5.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-agent-0.5.2.tgz"},"fleet-agent-0.5.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-0.5.2.tgz"},"fleet-0.5.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.5.2/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.5.2"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d3d84dd8.b0b8c899.js b/assets/js/d3d84dd8.534edb2d.js similarity index 71% rename from assets/js/d3d84dd8.b0b8c899.js rename to assets/js/d3d84dd8.534edb2d.js index 2fb2c6d6b..254b88938 100644 --- a/assets/js/d3d84dd8.b0b8c899.js +++ b/assets/js/d3d84dd8.534edb2d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9432],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.8/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.8/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.8/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.8/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.8/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable agent on local cluster\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9432],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.8/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.8/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.8/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.8/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.8/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable agent on local cluster\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d3d9887a.272737d9.js b/assets/js/d3d9887a.272737d9.js new file mode 100644 index 000000000..0830499a9 --- /dev/null +++ b/assets/js/d3d9887a.272737d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8249],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(a),m=r,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||l;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Expected Repo Structure",i={unversionedId:"gitrepo-structure",id:"version-0.5/gitrepo-structure",title:"Expected Repo Structure",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.5/gitrepo-structure.md",sourceDirName:".",slug:"/gitrepo-structure",permalink:"/0.5/gitrepo-structure",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/gitrepo-structure.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Adding a GitRepo",permalink:"/0.5/gitrepo-add"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.5/gitrepo-targets"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Reference",id:"reference",level:3},{value:"Private Helm Repositories",id:"private-helm-repositories",level:3},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle state",id:"cluster-and-bundle-state",level:2}],u={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"expected-repo-structure"},"Expected Repo Structure"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.5/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",{parentName:"admonition"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helmValues")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),".")))),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n variableName: global.fleet.clusterLabels.LABELNAME\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default \n key: values.yaml\n secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector: agroup\n \n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. \n clusterName: dev-cluster \n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n')),(0,r.yg)("h3",{id:"private-helm-repositories"},"Private Helm Repositories"),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in downstream clusters."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata: \n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file we be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.5/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d3d9887a.fae0bd06.js b/assets/js/d3d9887a.fae0bd06.js deleted file mode 100644 index 729aef7e4..000000000 --- a/assets/js/d3d9887a.fae0bd06.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8249],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(a),m=r,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||l;return a?n.createElement(h,o(o({ref:t},u),{},{components:a})):n.createElement(h,o({ref:t},u))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=a(8168),r=(a(6540),a(5680));const l={},o="Expected Repo Structure",i={unversionedId:"gitrepo-structure",id:"version-0.5/gitrepo-structure",title:"Expected Repo Structure",description:"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a fleet.yaml is found.",source:"@site/versioned_docs/version-0.5/gitrepo-structure.md",sourceDirName:".",slug:"/gitrepo-structure",permalink:"/0.5/gitrepo-structure",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/gitrepo-structure.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Adding a GitRepo",permalink:"/0.5/gitrepo-add"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.5/gitrepo-targets"}},s={},p=[{value:"How repos are scanned",id:"how-repos-are-scanned",level:2},{value:"fleet.yaml",id:"fleetyaml",level:2},{value:"Reference",id:"reference",level:3},{value:"Private Helm Repositories",id:"private-helm-repositories",level:3},{value:"Using ValuesFrom",id:"using-valuesfrom",level:3},{value:"Per Cluster Customization",id:"per-cluster-customization",level:2},{value:"Raw YAML Resource Customization",id:"raw-yaml-resource-customization",level:2},{value:"Cluster and Bundle state",id:"cluster-and-bundle-state",level:2}],u={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"expected-repo-structure"},"Expected Repo Structure"),(0,r.yg)("p",null,"Fleet will create bundles from a git repository. This happens either explicitly by specifying paths, or when a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is found."),(0,r.yg)("p",null,"Each bundle is created from paths in a GitRepo and modified further by reading the discovered ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file.\nBundle lifecycles are tracked between releases by the helm releaseName field added to each bundle. If the releaseName is not\nspecified within fleet.yaml it is generated from ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo.name + path"),". Long names are truncated and a ",(0,r.yg)("inlineCode",{parentName:"p"},"-")," prefix is added."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"The git repository has no explicitly required structure.")," It is important\nto realize the scanned resources will be saved as a resource in Kubernetes so\nyou want to make sure the directories you are scanning in git do not contain\narbitrarily large resources. Right now there is a limitation that the resources\ndeployed must ",(0,r.yg)("strong",{parentName:"p"},"gzip to less than 1MB"),"."),(0,r.yg)("h2",{id:"how-repos-are-scanned"},"How repos are scanned"),(0,r.yg)("p",null,"Multiple paths can be defined for a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and each path is scanned independently.\nInternally each scanned path will become a ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"bundle")," that Fleet will manage,\ndeploy, and monitor independently."),(0,r.yg)("p",null,"The following files are looked for to determine the how the resources will be deployed."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"File"),(0,r.yg)("th",{parentName:"tr",align:null},"Location"),(0,r.yg)("th",{parentName:"tr",align:null},"Meaning"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"Chart.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed as a Helm chart. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"kustomization.yaml"),":"),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")," or custom path from ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"The resources will be deployed using Kustomize. Refer to the ",(0,r.yg)("inlineCode",{parentName:"td"},"fleet.yaml")," for more options.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"fleet.yaml")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If any fleet.yaml is found a new ",(0,r.yg)("a",{parentName:"td",href:"/0.5/concepts"},"bundle")," will be defined. This allows mixing charts, kustomize, and raw YAML in the same repo")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"}," *.yaml ")),(0,r.yg)("td",{parentName:"tr",align:null},"Any subpath"),(0,r.yg)("td",{parentName:"tr",align:null},"If a ",(0,r.yg)("inlineCode",{parentName:"td"},"Chart.yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},"kustomization.yaml")," is not found then any ",(0,r.yg)("inlineCode",{parentName:"td"},".yaml")," or ",(0,r.yg)("inlineCode",{parentName:"td"},".yml")," file will be assumed to be a Kubernetes resource and will be deployed.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("strong",{parentName:"td"},"overlays/{name}")),(0,r.yg)("td",{parentName:"tr",align:null},"/ relative to ",(0,r.yg)("inlineCode",{parentName:"td"},"path")),(0,r.yg)("td",{parentName:"tr",align:null},"When deploying using raw YAML (not Kustomize or Helm) ",(0,r.yg)("inlineCode",{parentName:"td"},"overlays")," is a special directory for customizations.")))),(0,r.yg)("h2",{id:"fleetyaml"},(0,r.yg)("inlineCode",{parentName:"h2"},"fleet.yaml")),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is an optional file that can be included in the git repository to change the behavior of how\nthe resources are deployed and customized. The ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," is always at the root relative to the ",(0,r.yg)("inlineCode",{parentName:"p"},"path")," of the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),"\nand if a subdirectory is found with a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," a new ",(0,r.yg)("a",{parentName:"p",href:"/0.5/concepts"},"bundle")," is defined that will then be\nconfigured differently from the parent bundle."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Helm chart dependencies"),":\nIt is up to the user to fulfill the dependency list for the Helm charts. As such, you must manually run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies update $chart")," OR run ",(0,r.yg)("inlineCode",{parentName:"p"},"helm dependencies build $chart")," prior to install. See the ",(0,r.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.6/en/deploy-across-clusters/fleet/#helm-chart-dependencies"},"Fleet docs")," in Rancher for more information.")),(0,r.yg)("h3",{id:"reference"},"Reference"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"How changes are applied to ",(0,r.yg)("inlineCode",{parentName:"strong"},"values.yaml")),":"),(0,r.yg)("ul",{parentName:"admonition"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Note that the most recently applied changes to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," will override any previously existing values.")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"When changes are applied to the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," from multiple sources at the same time, the values will update in the following order: ",(0,r.yg)("inlineCode",{parentName:"p"},"helmValues")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFiles")," -> ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.valuesFrom"),".")))),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'# The default namespace to be applied to resources. This field is not used to\n# enforce or lock down the deployment to a specific namespace, but instead\n# provide the default value of the namespace field if one is not specified\n# in the manifests.\n# Default: default\ndefaultNamespace: default\n\n# All resources will be assigned to this namespace and if any cluster scoped\n# resource exists the deployment will fail.\n# Default: ""\nnamespace: default\n\nkustomize:\n # Use a custom folder for kustomize resources. This folder must contain\n # a kustomization.yaml file.\n dir: ./kustomize\n\nhelm:\n # Use a custom location for the Helm chart. This can refer to any go-getter URL or\n # OCI registry based helm chart URL e.g. "oci://ghcr.io/fleetrepoci/guestbook".\n # This allows one to download charts from most any location. Also know that\n # go-getter URL supports adding a digest to validate the download. If repo\n # is set below this field is the name of the chart to lookup\n chart: ./chart\n # A https URL to a Helm repo to download the chart from. It\'s typically easier\n # to just use `chart` field and refer to a tgz file. If repo is used the\n # value of `chart` will be used as the chart name to lookup in the Helm repository.\n repo: https://charts.rancher.io\n # A custom release name to deploy the chart as. If not specified a release name\n # will be generated by combining the invoking GitRepo.name + GitRepo.path.\n releaseName: my-release\n # The version of the chart or semver constraint of the chart to find. If a constraint\n # is specified it is evaluated each time git changes.\n # The version also determines which chart to download from OCI registries.\n version: 0.1.0\n # Any values that should be placed in the `values.yaml` and passed to helm during\n # install.\n values:\n any-custom: value\n # All labels on Rancher clusters are available using global.fleet.clusterLabels.LABELNAME\n # These can now be accessed directly as variables\n variableName: global.fleet.clusterLabels.LABELNAME\n # Path to any values files that need to be passed to helm during install\n valuesFiles:\n - values1.yaml\n - values2.yaml\n # Allow to use values files from configmaps or secrets\n valuesFrom:\n - configMapKeyRef:\n name: configmap-values\n # default to namespace of bundle\n namespace: default \n key: values.yaml\n secretKeyRef:\n name: secret-values\n namespace: default\n key: values.yaml\n # Override immutable resources. This could be dangerous.\n force: false\n # Set the Helm --atomic flag when upgrading\n atomic: false\n\n# A paused bundle will not update downstream clusters but instead mark the bundle\n# as OutOfSync. One can then manually confirm that a bundle should be deployed to\n# the downstream clusters.\n# Default: false\npaused: false\n\nrolloutStrategy:\n # A number or percentage of clusters that can be unavailable during an update\n # of a bundle. This follows the same basic approach as a deployment rollout\n # strategy. Once the number of clusters meets unavailable state update will be\n # paused. Default value is 100% which doesn\'t take effect on update.\n # default: 100%\n maxUnavailable: 15%\n # A number or percentage of cluster partitions that can be unavailable during\n # an update of a bundle.\n # default: 0\n maxUnavailablePartitions: 20%\n # A number of percentage of how to automatically partition clusters if not\n # specific partitioning strategy is configured.\n # default: 25%\n autoPartitionSize: 10%\n # A list of definitions of partitions. If any target clusters do not match\n # the configuration they are added to partitions at the end following the\n # autoPartitionSize.\n partitions:\n # A user friend name given to the partition used for Display (optional).\n # default: ""\n - name: canary\n # A number or percentage of clusters that can be unavailable in this\n # partition before this partition is treated as done.\n # default: 10%\n maxUnavailable: 10%\n # Selector matching cluster labels to include in this partition\n clusterSelector:\n matchLabels:\n env: prod\n # A cluster group name to include in this partition\n clusterGroup: agroup\n # Selector matching cluster group labels to include in this partition\n clusterGroupSelector: agroup\n \n# Target customization are used to determine how resources should be modified per target\n# Targets are evaluated in order and the first one to match a cluster is used for that cluster.\ntargetCustomizations:\n# The name of target. If not specified a default name of the format "target000"\n# will be used. This value is mostly for display\n- name: prod\n # Custom namespace value overriding the value at the root\n namespace: newvalue\n # Custom defaultNamespace value overriding the value at the root\n defaultNamespace: newdefaultvalue\n # Custom kustomize options overriding the options at the root\n kustomize: {}\n # Custom Helm options override the options at the root\n helm: {}\n # If using raw YAML these are names that map to overlays/{name} that will be used\n # to replace or patch a resource. If you wish to customize the file ./subdir/resource.yaml\n # then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file.\n # A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.\n # A patch can in JSON Patch or JSON Merge format or a strategic merge patch for builtin\n # Kubernetes types. Refer to "Raw YAML Resource Customization" below for more information.\n yaml:\n overlays:\n - custom2\n - custom3\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match a specific cluster by name. \n clusterName: dev-cluster \n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n\n# dependsOn allows you to configure dependencies to other bundles. The current bundle\n# will only be deployed, after all dependencies are deployed and in a Ready state.\ndependsOn:\n # Format: - with all path separators replaced by "-"\n # Example: GitRepo name "one", Bundle path "/multi-cluster/hello-world" => "one-multi-cluster-hello-world"\n - name: one-multi-cluster-hello-world\n')),(0,r.yg)("h3",{id:"private-helm-repositories"},"Private Helm Repositories"),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret from the git repo resource.\nSee ",(0,r.yg)("a",{parentName:"p",href:"gitrepo-add#using-private-helm-repositories"},"Using Private Helm Repositories")," for more information."),(0,r.yg)("h3",{id:"using-valuesfrom"},"Using ValuesFrom"),(0,r.yg)("p",null,"These examples showcase the style and format for using ",(0,r.yg)("inlineCode",{parentName:"p"},"valuesFrom"),". ConfigMaps and Secrets should be created in downstream clusters."),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/configmap/"},"ConfigMap"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: configmap-values\n namespace: default\ndata: \n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("p",null,"Example ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/configuration/secret/"},"Secret"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: secret-values\n namespace: default\nstringData:\n values.yaml: |-\n replication: true\n replicas: 2\n serviceType: NodePort\n")),(0,r.yg)("h2",{id:"per-cluster-customization"},"Per Cluster Customization"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," defines which clusters a git repository should be deployed to and the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in the repository\ndetermines how the resources are customized per target."),(0,r.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets of that\n",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". The targets list is evaluated one by one and if there is a match the resource will be deployed to the cluster.\nIf no match is made against the target list on the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the resources will not be deployed to that cluster.\nOnce a target cluster is matched the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," from the git repository is then consulted for customizations. The\n",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," will be evaluated one by one and the first match will define how the\nresource is to be configured. If no match is made the resources will be deployed with no additional customizations."),(0,r.yg)("p",null,"There are three approaches to matching clusters for both ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," ",(0,r.yg)("inlineCode",{parentName:"p"},"targetCustomizations"),'.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,r.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,r.yg)("h2",{id:"raw-yaml-resource-customization"},"Raw YAML Resource Customization"),(0,r.yg)("p",null,"When using Kustomize or Helm the ",(0,r.yg)("inlineCode",{parentName:"p"},"kustomization.yaml")," or the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm.values")," will control how the resource are\ncustomized per target cluster. If you are using raw YAML then the following simple mechanism is built-in and can\nbe used. The ",(0,r.yg)("inlineCode",{parentName:"p"},"overlays/")," folder in the git repo is treated specially as folder containing folders that\ncan be selected to overlay on top per target cluster. The resource overlay content\nuses a file name based approach. This is different from kustomize which uses a resource based approach. In kustomize\nthe resource Group, Kind, Version, Name, and Namespace identify resources and are then merged or patched. For Fleet\nthe overlay resources will override or patch content with a matching file name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Base files\ndeployment.yaml\nsvc.yaml\n\n# Overlay files\n\n# The following file we be added\noverlays/custom/configmap.yaml\n# The following file will replace svc.yaml\noverlays/custom/svc.yaml\n# The following file will patch deployment.yaml\noverlays/custom/deployment_patch.yaml\n")),(0,r.yg)("p",null,"A file named ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," will replace a file called ",(0,r.yg)("inlineCode",{parentName:"p"},"foo")," from the base resources or a previous overlay. In order to patch\nthe contents a file the convention of adding ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch.")," (notice the trailing period) to the filename is used. The string ",(0,r.yg)("inlineCode",{parentName:"p"},"_patch."),"\nwill be replaced with ",(0,r.yg)("inlineCode",{parentName:"p"},".")," from the file name and that will be used as the target. For example ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment_patch.yaml"),"\nwill target ",(0,r.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The patch will be applied using JSON Merge, Strategic Merge Patch, or JSON Patch.\nWhich strategy is used is based on the file content. Even though JSON strategies are used, the files can be written\nusing YAML syntax."),(0,r.yg)("h2",{id:"cluster-and-bundle-state"},"Cluster and Bundle state"),(0,r.yg)("p",null,"See ",(0,r.yg)("a",{parentName:"p",href:"/0.5/cluster-bundles-state"},"Cluster and Bundle state"),"."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d48f7c02.20997617.js b/assets/js/d48f7c02.20997617.js deleted file mode 100644 index 4f5b06282..000000000 --- a/assets/js/d48f7c02.20997617.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[333],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>h});var o=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(s,".").concat(d)]||p[d]||g[d]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>g,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(8168),r=(n(6540),n(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.10/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/versioned_docs/version-0.10/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.10/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/webhook.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.10/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.10/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,o.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Azure DevOps, GitHub, GitLab, Bitbucket, Bitbucket Server, and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("p",null,"If you want to have the webhook available using the same host name as your Rancher or another service, you can use the following YAML with the URL ",(0,r.yg)("a",{parentName:"p",href:"http://your.domain.com/gitjob"},"http://your.domain.com/gitjob"),". The below YAML is specific for the Nginx Ingress Controller:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n annotations:\n nginx.ingress.kubernetes.io/use-regex: "true"\n nginx.ingress.kubernetes.io/rewrite-target: /$2\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /gitjob(/|$)(.*)\n pathType: ImplementationSpecific\n backend:\n service:\n name: gitjob\n port:\n number: 80\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-username"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-password"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("p",null,"For Azure DevOps:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Enable basic authentication in Azure"),(0,r.yg)("li",{parentName:"ul"},"Create a secret containing the credentials for the basic authentication")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}g.isMDXComponent=!0},4068:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/d48f7c02.51913f73.js b/assets/js/d48f7c02.51913f73.js new file mode 100644 index 000000000..ea3defe72 --- /dev/null +++ b/assets/js/d48f7c02.51913f73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[333],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>h});var o=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(s,".").concat(d)]||p[d]||g[d]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>g,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(8168),r=(n(6540),n(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.10/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/versioned_docs/version-0.10/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.10/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/webhook.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.10/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.10/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,o.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Azure DevOps, GitHub, GitLab, Bitbucket, Bitbucket Server, and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("p",null,"If you want to have the webhook available using the same host name as your Rancher or another service, you can use the following YAML with the URL ",(0,r.yg)("a",{parentName:"p",href:"http://your.domain.com/gitjob"},"http://your.domain.com/gitjob"),". The below YAML is specific for the Nginx Ingress Controller:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n annotations:\n nginx.ingress.kubernetes.io/use-regex: "true"\n nginx.ingress.kubernetes.io/rewrite-target: /$2\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /gitjob(/|$)(.*)\n pathType: ImplementationSpecific\n backend:\n service:\n name: gitjob\n port:\n number: 80\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-username"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Azure DevOps"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"azure-password"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("p",null,"For Azure DevOps:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Enable basic authentication in Azure"),(0,r.yg)("li",{parentName:"ul"},"Create a secret containing the credentials for the basic authentication")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}g.isMDXComponent=!0},4068:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/cf6f5f9b.ac2bea58.js b/assets/js/d53097a5.6e53adb9.js similarity index 83% rename from assets/js/cf6f5f9b.ac2bea58.js rename to assets/js/d53097a5.6e53adb9.js index e816a3170..0d1e1a98e 100644 --- a/assets/js/cf6f5f9b.ac2bea58.js +++ b/assets/js/d53097a5.6e53adb9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4044],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.7/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.7/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.7/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/architecture.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.7/uninstall"},next:{title:"Core Concepts",permalink:"/0.7/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.7/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3105],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.9/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.9/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.9/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/architecture.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.9/uninstall"},next:{title:"Core Concepts",permalink:"/0.9/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/d53097a5.bd5f0777.js b/assets/js/d53097a5.bd5f0777.js deleted file mode 100644 index f6b10afce..000000000 --- a/assets/js/d53097a5.bd5f0777.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3105],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,g=p["".concat(l,".").concat(m)]||p[m]||h[m]||o;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Architecture",s={unversionedId:"architecture",id:"version-0.9/architecture",title:"Architecture",description:"Fleet has two primary components. The Fleet manager and the cluster agents. These",source:"@site/versioned_docs/version-0.9/architecture.md",sourceDirName:".",slug:"/architecture",permalink:"/0.9/architecture",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/architecture.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.9/uninstall"},next:{title:"Core Concepts",permalink:"/0.9/concepts"}},l={},c=[{value:"Fleet Manager",id:"fleet-manager",level:2},{value:"Cluster Agents",id:"cluster-agents",level:2},{value:"Security",id:"security",level:2},{value:"Component Overview",id:"component-overview",level:2}],u={toc:c},p="wrapper";function h(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"architecture"},"Architecture"),(0,a.yg)("p",null,"Fleet has two primary components. The Fleet manager and the cluster agents. These\ncomponents work in a two-stage pull model. The Fleet manager will pull from git and the\ncluster agents will pull from the Fleet manager."),(0,a.yg)("h2",{id:"fleet-manager"},"Fleet Manager"),(0,a.yg)("p",null,"The Fleet manager is a set of Kubernetes controllers running in any standard Kubernetes\ncluster. The only API exposed by the Fleet manager is the Kubernetes API, there is no\ncustom API for the fleet controller."),(0,a.yg)("h2",{id:"cluster-agents"},"Cluster Agents"),(0,a.yg)("p",null,"One cluster agent runs in each cluster and is responsible for talking to the Fleet manager.\nThe only communication from cluster to Fleet manager is by this agent and all communication\ngoes from the managed cluster to the Fleet manager. The fleet manager does not initiate\nconnections to downstream clusters. This means managed clusters can run in private networks and behind\nNATs. The only requirement is the cluster agent needs to be able to communicate with the\nKubernetes API of the cluster running the Fleet manager. The one exception to this is if you use\nthe ",(0,a.yg)("a",{parentName:"p",href:"/0.9/cluster-registration#manager-initiated"},"manager initiated")," cluster registration flow. This is not required, but\nan optional pattern."),(0,a.yg)("p",null,'The cluster agents are not assumed to have an "always on" connection. They will resume operation as\nsoon as they can connect. Future enhancements will probably add the ability to schedule times of when\nthe agent checks in, as it stands right now they will always attempt to connect.'),(0,a.yg)("h2",{id:"security"},"Security"),(0,a.yg)("p",null,'The Fleet manager dynamically creates service accounts, manages their RBAC and then gives the\ntokens to the downstream clusters. Clusters are registered by optionally expiring cluster registration tokens.\nThe cluster registration token is used only during the registration process to generate a credential specific\nto that cluster. After the cluster credential is established the cluster "forgets" the cluster registration\ntoken.'),(0,a.yg)("p",null,"The service accounts given to the clusters only have privileges to list ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," in the namespace created\nspecifically for that cluster. It can also update the ",(0,a.yg)("inlineCode",{parentName:"p"},"status")," subresource of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," and the ",(0,a.yg)("inlineCode",{parentName:"p"},"status"),"\nsubresource of it's ",(0,a.yg)("inlineCode",{parentName:"p"},"Cluster")," resource."),(0,a.yg)("h2",{id:"component-overview"},"Component Overview"),(0,a.yg)("p",null,"An overview of the components and how they interact on a high level."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Components",src:n(8120).A,width:"1319",height:"1281"})))}h.isMDXComponent=!0},8120:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetComponents-2746fa09558c69f438948ab9bc659edb.svg"}}]); \ No newline at end of file diff --git a/assets/js/d596b4b8.b6cd200d.js b/assets/js/d596b4b8.b6cd200d.js deleted file mode 100644 index 5a9083331..000000000 --- a/assets/js/d596b4b8.b6cd200d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7267],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),c=s(a),u=n,h=c["".concat(p,".").concat(u)]||c[u]||m[u]||l;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,o[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.8.1",date:"2023-11-23 10:06:23 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.1",id:"version-0.8/changelogs/changelogs/v0.8.1",title:"v0.8.1",description:"(rancherio-gh-m) released this 2023-11-23 1023 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.1",permalink:"/0.8/changelogs/changelogs/v0.8.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.1.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.8.1",date:"2023-11-23 10:06:23 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.0",permalink:"/0.8/changelogs/changelogs/v0.8.0"},next:{title:"v0.8.2",permalink:"/0.8/changelogs/changelogs/v0.8.2"}},p={},s=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:s},c="wrapper";function m(e){let{components:t,...a}=e;return(0,n.yg)(c,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-11-23 10:06:23 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Bump bci/bci-base from 15.5.36.5.25 to 15.5.36.5.54 in /package"),(0,n.yg)("li",null,"Bump Gitjob chart to 0.1.76-security1")),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.0...v0.8.1"},(0,n.yg)("tt",null,"v0.8.0...v0.8.1"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-crd-0.8.1.tgz"},"fleet-crd-0.8.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-agent-0.8.1.tgz"},"fleet-agent-0.8.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-0.8.1.tgz"},"fleet-0.8.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.1"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d596b4b8.d7c0bc85.js b/assets/js/d596b4b8.d7c0bc85.js new file mode 100644 index 000000000..7d1bda05e --- /dev/null +++ b/assets/js/d596b4b8.d7c0bc85.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7267],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),c=s(a),u=n,h=c["".concat(p,".").concat(u)]||c[u]||m[u]||l;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=u;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:n,o[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.8.1",date:"2023-11-23 10:06:23 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.1",id:"version-0.8/changelogs/changelogs/v0.8.1",title:"v0.8.1",description:"(rancherio-gh-m) released this 2023-11-23 1023 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.1.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.1",permalink:"/0.8/changelogs/changelogs/v0.8.1",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.1.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.8.1",date:"2023-11-23 10:06:23 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.0",permalink:"/0.8/changelogs/changelogs/v0.8.0"},next:{title:"v0.8.2",permalink:"/0.8/changelogs/changelogs/v0.8.2"}},p={},s=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:s},c="wrapper";function m(e){let{components:t,...a}=e;return(0,n.yg)(c,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-11-23 10:06:23 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Bump bci/bci-base from 15.5.36.5.25 to 15.5.36.5.54 in /package"),(0,n.yg)("li",null,"Bump Gitjob chart to 0.1.76-security1")),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.0...v0.8.1"},(0,n.yg)("tt",null,"v0.8.0...v0.8.1"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-crd-0.8.1.tgz"},"fleet-crd-0.8.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-agent-0.8.1.tgz"},"fleet-agent-0.8.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-0.8.1.tgz"},"fleet-0.8.1.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.1/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.1"},"here"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6daf0cc.4ec5410d.js b/assets/js/d6daf0cc.4ec5410d.js new file mode 100644 index 000000000..5aa2689fd --- /dev/null +++ b/assets/js/d6daf0cc.4ec5410d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8428],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=o,f=u["".concat(l,".").concat(d)]||u[d]||h[d]||a;return n?r.createElement(f,i(i({ref:t},p),{},{components:n})):r.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const a={},i="GitRepo Resource",s={unversionedId:"ref-gitrepo",id:"ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/docs/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-gitrepo.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/ref-bundle"}},l={},c=[],p={toc:c},u="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private git repository you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n\n # Contains the auth secret for private Helm repository for each path.\n # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)\n #\n # helmSecretNameForPaths: multi-helm-secret\n\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # When disablePolling is set to true the git repo won\'t be checked periodically.\n # It will rely on webhooks only.\n # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)\n # disablePolling: false\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default.\n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating\n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6daf0cc.a14d4afc.js b/assets/js/d6daf0cc.a14d4afc.js deleted file mode 100644 index 1db9eb2cc..000000000 --- a/assets/js/d6daf0cc.a14d4afc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8428],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=o,f=u["".concat(l,".").concat(d)]||u[d]||h[d]||a;return n?r.createElement(f,i(i({ref:t},p),{},{components:n})):r.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const a={},i="GitRepo Resource",s={unversionedId:"ref-gitrepo",id:"ref-gitrepo",title:"GitRepo Resource",description:"The GitRepo resource describes git repositories, how to access them and where the bundles are located.",source:"@site/docs/ref-gitrepo.md",sourceDirName:".",slug:"/ref-gitrepo",permalink:"/ref-gitrepo",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-gitrepo.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet.yaml",permalink:"/ref-fleet-yaml"},next:{title:"Bundle Resource",permalink:"/ref-bundle"}},l={},c=[],p={toc:c},u="wrapper";function h(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"gitrepo-resource"},"GitRepo Resource"),(0,o.yg)("p",null,"The GitRepo resource describes git repositories, how to access them and where the bundles are located."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#gitrepospec"},"GitRepoSpec"),".\nFor more information on how to use GitRepo resource, e.g. how to watch private repositories, see ",(0,o.yg)("a",{parentName:"p",href:"/gitrepo-add"},"Create a GitRepo Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-repo\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # This can be a HTTPS or git URL. If you are using a git URL then\n # clientSecretName will probably need to be set to supply a credential.\n # repo is the only required parameter for a repo to be monitored.\n #\n repo: https://github.com/rancher/fleet-examples\n\n # Enforce all resources go to this target namespace. If a cluster scoped\n # resource is found the deployment will fail.\n #\n # targetNamespace: app1\n\n # Any branch can be watched, this field is optional. If not specified the\n # branch is assumed to be master\n #\n # branch: master\n\n # A specific commit or tag can also be watched.\n #\n # revision: v0.3.0\n\n # For a private git repository you must supply a clientSecretName. A default\n # secret can be set at the namespace level using the GitRepoRestriction\n # type. Secrets must be of the type "kubernetes.io/ssh-auth" or\n # "kubernetes.io/basic-auth". The secret is assumed to be in the\n # same namespace as the GitRepo\n #\n # clientSecretName: my-ssh-key\n\n # If fleet.yaml contains a private Helm repo that requires authentication,\n # provide the credentials in a K8s secret and specify them here.\n # Danger: the credentials will be sent to all repositories referenced from\n # this gitrepo. See section below for more information.\n #\n # helmSecretName: my-helm-secret\n\n # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.\n # Credentials will always be used if it is empty or not provided\n #\n # helmRepoURLRegex: https://charts.rancher.io/*\n\n # Contains the auth secret for private Helm repository for each path.\n # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)\n #\n # helmSecretNameForPaths: multi-helm-secret\n\n # To add additional ca-bundle for self-signed certs, caBundle can be\n # filled with base64 encoded pem data. For example:\n # `cat /path/to/ca.pem | base64 -w 0`\n #\n # caBundle: my-ca-bundle\n\n # Disable SSL verification for git repo\n #\n # insecureSkipTLSVerify: true\n\n # A git repo can read multiple paths in a repo at once.\n # The below field is expected to be an array of paths and\n # supports path globbing (ex: some/*/path)\n #\n # Example:\n # paths:\n # - single-path\n # - multiple-paths/*\n paths:\n - simple\n\n # PollingInterval configures how often fleet checks the git repo. The default\n # is 15 seconds.\n # Setting this to zero does not disable polling. It results in a 15s\n # interval, too.\n # As checking a git repo incurs a CPU cost, raising this value can help\n # lowering fleetcontroller\'s CPU usage if tens of git repos are used or more\n #\n # pollingInterval: 15s\n\n # When disablePolling is set to true the git repo won\'t be checked periodically.\n # It will rely on webhooks only.\n # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)\n # disablePolling: false\n\n # Paused causes changes in Git to not be propagated down to the clusters but\n # instead mark resources as OutOfSync\n #\n # paused: false\n\n # Increment this number to force a redeployment of contents from Git\n #\n # forceSyncGeneration: 0\n\n # The service account that will be used to perform this deployment.\n # This is the name of the service account that exists in the\n # downstream cluster in the cattle-fleet-system namespace. It is assumed\n # this service account already exists so it should be create before\n # hand, most likely coming from another git repo registered with\n # the Fleet manager.\n #\n # serviceAccount: moreSecureAccountThanClusterAdmin\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n # If empty, the "default" cluster group is used.\n #\n # targets: ...\n\n # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses\n # a three-way merge strategy by default.\n # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating\n # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.\n # Keep in mind that resources might be recreated if force is enabled.\n # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.\n #\n # correctDrift:\n # enabled: false\n # force: false #Warning: it might recreate resources if set to true\n # keepFailHistory: false\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d8b566f1.2a6621b8.js b/assets/js/d8b566f1.2a6621b8.js new file mode 100644 index 000000000..aa02159c5 --- /dev/null +++ b/assets/js/d8b566f1.2a6621b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8875],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,y=d["".concat(s,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(y,o(o({ref:t},p),{},{components:n})):a.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.10/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.10/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.10/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/bundle-add.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.10/imagescan"},next:{title:"fleet-agent",permalink:"/0.10/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d8b566f1.6fa7d587.js b/assets/js/d8b566f1.6fa7d587.js deleted file mode 100644 index b5dd6306e..000000000 --- a/assets/js/d8b566f1.6fa7d587.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8875],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,y=d["".concat(s,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(y,o(o({ref:t},p),{},{components:n})):a.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.10/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.10/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.10/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/bundle-add.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.10/imagescan"},next:{title:"fleet-agent",permalink:"/0.10/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d8f58335.6a60e297.js b/assets/js/d8f58335.60e14460.js similarity index 63% rename from assets/js/d8f58335.6a60e297.js rename to assets/js/d8f58335.60e14460.js index bc7920745..12249f38a 100644 --- a/assets/js/d8f58335.6a60e297.js +++ b/assets/js/d8f58335.60e14460.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3051],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),f=a,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||o;return n?r.createElement(m,s(s({ref:t},u),{},{components:n})):r.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=f;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Advanced Users",i={unversionedId:"advanced-users",id:"version-0.4/advanced-users",title:"Advanced Users",description:"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.",source:"@site/versioned_docs/version-0.4/advanced-users.md",sourceDirName:".",slug:"/advanced-users",permalink:"/0.4/advanced-users",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/advanced-users.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.4/troubleshooting"},next:{title:"Installation",permalink:"/0.4/installation"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"advanced-users"},"Advanced Users"),(0,a.yg)("p",null,"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases."),(0,a.yg)("p",null,"The following are examples of advanced use cases:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"Nested GitRepo CRs"),(0,a.yg)("blockquote",{parentName:"li"},(0,a.yg)("p",{parentName:"blockquote"},"Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.4/single-cluster-install"},"Single cluster installation"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.4/multi-cluster-install"},"Multi-cluster installation")," "))),(0,a.yg)("p",null,"Please refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/installation"},"installation")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/uninstall"},"uninstall")," documentation for additional information."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3051],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),f=a,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||o;return n?r.createElement(m,s(s({ref:t},u),{},{components:n})):r.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=f;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Advanced Users",i={unversionedId:"advanced-users",id:"version-0.4/advanced-users",title:"Advanced Users",description:"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.",source:"@site/versioned_docs/version-0.4/advanced-users.md",sourceDirName:".",slug:"/advanced-users",permalink:"/0.4/advanced-users",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/advanced-users.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.4/troubleshooting"},next:{title:"Installation",permalink:"/0.4/installation"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"advanced-users"},"Advanced Users"),(0,a.yg)("p",null,"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases."),(0,a.yg)("p",null,"The following are examples of advanced use cases:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"Nested GitRepo CRs"),(0,a.yg)("blockquote",{parentName:"li"},(0,a.yg)("p",{parentName:"blockquote"},"Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.4/single-cluster-install"},"Single cluster installation"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.4/multi-cluster-install"},"Multi-cluster installation")," "))),(0,a.yg)("p",null,"Please refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/installation"},"installation")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.4/uninstall"},"uninstall")," documentation for additional information."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d9b00040.0bcf7daa.js b/assets/js/d9b00040.681ceb82.js similarity index 61% rename from assets/js/d9b00040.0bcf7daa.js rename to assets/js/d9b00040.681ceb82.js index 10a1240bf..e4d4bdefc 100644 --- a/assets/js/d9b00040.0bcf7daa.js +++ b/assets/js/d9b00040.681ceb82.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1544],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4312:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.10/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.10/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.10/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/quickstart.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.10/"},next:{title:"Creating a Deployment",permalink:"/0.10/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1544],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4312:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.10/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.10/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.10/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/quickstart.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.10/"},next:{title:"Creating a Deployment",permalink:"/0.10/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/da21831e.db18ec44.js b/assets/js/da21831e.871cf55c.js similarity index 63% rename from assets/js/da21831e.db18ec44.js rename to assets/js/da21831e.871cf55c.js index a678d6cc8..c919ca073 100644 --- a/assets/js/da21831e.db18ec44.js +++ b/assets/js/da21831e.871cf55c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3908],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),f=a,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||o;return n?r.createElement(m,s(s({ref:t},u),{},{components:n})):r.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=f;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Advanced Users",i={unversionedId:"advanced-users",id:"version-0.5/advanced-users",title:"Advanced Users",description:"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.",source:"@site/versioned_docs/version-0.5/advanced-users.md",sourceDirName:".",slug:"/advanced-users",permalink:"/0.5/advanced-users",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/advanced-users.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.5/troubleshooting"},next:{title:"Installation",permalink:"/0.5/installation"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"advanced-users"},"Advanced Users"),(0,a.yg)("p",null,"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases."),(0,a.yg)("p",null,"The following are examples of advanced use cases:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"Nested GitRepo CRs"),(0,a.yg)("blockquote",{parentName:"li"},(0,a.yg)("p",{parentName:"blockquote"},"Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/single-cluster-install"},"Single cluster installation"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/multi-cluster-install"},"Multi-cluster installation")," "))),(0,a.yg)("p",null,"Please refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/installation"},"installation")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/uninstall"},"uninstall")," documentation for additional information."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3908],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),f=a,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||o;return n?r.createElement(m,s(s({ref:t},u),{},{components:n})):r.createElement(m,s({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=f;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[d]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},s="Advanced Users",i={unversionedId:"advanced-users",id:"version-0.5/advanced-users",title:"Advanced Users",description:"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases.",source:"@site/versioned_docs/version-0.5/advanced-users.md",sourceDirName:".",slug:"/advanced-users",permalink:"/0.5/advanced-users",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/advanced-users.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.5/troubleshooting"},next:{title:"Installation",permalink:"/0.5/installation"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,r.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"advanced-users"},"Advanced Users"),(0,a.yg)("p",null,"Note that using Fleet outside of Rancher is highly discouraged for any users who do not need to perform advanced actions. However, there are some advanced use cases that may need to be performed outside of Rancher, also known as Standalone Fleet, or Fleet without Rancher. This section will highlight such use cases."),(0,a.yg)("p",null,"The following are examples of advanced use cases:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},"Nested GitRepo CRs"),(0,a.yg)("blockquote",{parentName:"li"},(0,a.yg)("p",{parentName:"blockquote"},"Managing Fleet within Fleet (nested GitRepo usage) is not currently supported. We will update the documentation if support becomes available."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/single-cluster-install"},"Single cluster installation"))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("a",{parentName:"p",href:"/0.5/multi-cluster-install"},"Multi-cluster installation")," "))),(0,a.yg)("p",null,"Please refer to the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/installation"},"installation")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/uninstall"},"uninstall")," documentation for additional information."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db0ebd24.334f1aab.js b/assets/js/db0ebd24.334f1aab.js new file mode 100644 index 000000000..e4f5683b0 --- /dev/null +++ b/assets/js/db0ebd24.334f1aab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7492],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.8/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.8/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.8/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-bundle.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.8/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.8/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.8/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/db0ebd24.3c6cdcd6.js b/assets/js/db0ebd24.3c6cdcd6.js deleted file mode 100644 index 6c3a91e8b..000000000 --- a/assets/js/db0ebd24.3c6cdcd6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7492],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>m});var r=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),f=o,m=u["".concat(i,".").concat(f)]||u[f]||d[f]||a;return t?r.createElement(m,l(l({ref:n},p),{},{components:t})):r.createElement(m,l({ref:n},p))}));function m(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=f;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:o,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=t(8168),o=(t(6540),t(5680));const a={},l="Bundle Resource",s={unversionedId:"ref-bundle",id:"version-0.8/ref-bundle",title:"Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created.",source:"@site/versioned_docs/version-0.8/ref-bundle.md",sourceDirName:".",slug:"/ref-bundle",permalink:"/0.8/ref-bundle",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/ref-bundle.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"GitRepo Resource",permalink:"/0.8/ref-gitrepo"},next:{title:"Troubleshooting",permalink:"/0.8/troubleshooting"}},i={},c=[],p={toc:c},u="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(u,(0,r.A)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-resource"},"Bundle Resource"),(0,o.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,o.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created."),(0,o.yg)("p",null,"The content of the resource corresponds to the ",(0,o.yg)("a",{parentName:"p",href:"./ref-crds#bundlespec"},"BundleSpec"),".\nFor more information on how to use the Bundle resource ",(0,o.yg)("a",{parentName:"p",href:"/0.8/bundle-add"},"Create a Bundle Resource"),"."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n # Namespace used for resources that do not specify a namespace.\n # This field is not used to enforce or lock down the deployment to a specific namespace.\n # defaultNamespace: test\n\n # If present will assign all resource to this\n # namespace and if any cluster scoped resource exists the deployment will fail.\n # targetNamespace: app\n\n # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.\n # kustomize: ...\n\n # Helm options for the deployment, like the chart name, repo and values.\n # helm: ...\n\n # ServiceAccount which will be used to perform this deployment.\n # serviceAccount: sa\n\n # ForceSyncGeneration is used to force a redeployment.\n # forceSyncGeneration: 0\n\n # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.\n # yaml: ...\n\n # Diff can be used to ignore the modified state of objects which are amended at runtime.\n # A specific commit or tag can also be watched.\n #\n # diff: ...\n\n # KeepResources can be used to keep the deployed resources when removing the bundle.\n # keepResources: false\n\n # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.\n # paused: false\n\n # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.\n # rolloutStrategy: ...\n\n # Contain the actual resources from the git repo which will be deployed.\n resources:\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n\n # Target clusters to deploy to if running Fleet in a multi-cluster\n # style. Refer to the "Mapping to Downstream Clusters" docs for\n # more information.\n #\n # targets: ...\n\n # This field is used by Fleet internally, and it should not be modified manually.\n # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.\n # targetRestrictions: ...\n\n # Refers to the bundles which must be ready before this bundle can be deployed.\n # dependsOn: ...\n\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dd67116e.bb4e40b1.js b/assets/js/dd67116e.bb4e40b1.js new file mode 100644 index 000000000..205f05a24 --- /dev/null +++ b/assets/js/dd67116e.bb4e40b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5039],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),g=r,m=p["".concat(l,".").concat(g)]||p[g]||d[g]||i;return n?a.createElement(m,o(o({ref:t},u),{},{components:n})):a.createElement(m,o({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const i={},o="Cluster Registration Tokens",s={unversionedId:"cluster-tokens",id:"version-0.4/cluster-tokens",title:"Cluster Registration Tokens",description:"Not needed for Manager initiated registration:",source:"@site/versioned_docs/version-0.4/cluster-tokens.md",sourceDirName:".",slug:"/cluster-tokens",permalink:"/0.4/cluster-tokens",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-tokens.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.4/cluster-overview"},next:{title:"Agent Initiated",permalink:"/0.4/agent-initiated"}},l={},c=[{value:"Token TTL",id:"token-ttl",level:2},{value:"Create a new Token",id:"create-a-new-token",level:2},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"cluster-registration-tokens"},"Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager initiated registration"),":\nFor manager initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h2",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h2",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.4/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h2",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dd81469d.b2e8d02d.js b/assets/js/dd81469d.bba2cbe1.js similarity index 63% rename from assets/js/dd81469d.b2e8d02d.js rename to assets/js/dd81469d.bba2cbe1.js index be9855c38..a251edb84 100644 --- a/assets/js/dd81469d.b2e8d02d.js +++ b/assets/js/dd81469d.bba2cbe1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5987],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/docs/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_test.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet target",permalink:"/cli/fleet-cli/fleet_target"},next:{title:"fleetcontroller",permalink:"/cli/fleet-controller/fleetcontroller"}},c={},s=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output (deprecated)"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5987],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet test"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_test",id:"cli/fleet-cli/fleet_test",title:"",description:"fleet test",source:"@site/docs/cli/fleet-cli/fleet_test.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_test",permalink:"/cli/fleet-cli/fleet_test",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_test.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet test"},sidebar:"docs",previous:{title:"fleet target",permalink:"/cli/fleet-cli/fleet_target"},next:{title:"fleetcontroller",permalink:"/cli/fleet-controller/fleetcontroller"}},c={},s=[{value:"fleet test",id:"fleet-test",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-test"},"fleet test"),(0,l.yg)("p",null,"Match a bundle to a target and render the output (deprecated)"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet test [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n -f, --file string Location of the fleet.yaml\n -g, --group string Cluster group to match against\n -L, --group-label strings Cluster group labels to match against\n -h, --help help for test\n -l, --label strings Cluster labels to match against\n -N, --name string Cluster name to match against\n -q, --quiet Just print the match and don't print the resources\n -t, --target string Explicit target to match\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/de08e76e.a63920b8.js b/assets/js/de08e76e.a63920b8.js deleted file mode 100644 index 761c810b1..000000000 --- a/assets/js/de08e76e.a63920b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6677],{5680:(e,t,a)=>{a.d(t,{xA:()=>y,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},y=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,y=i(e,["components","mdxType","originalType","parentName"]),m=u(a),d=l,o=m["".concat(p,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},y),{},{components:a})):n.createElement(o,g({ref:t},y))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"ref-crds",title:"Custom Resources Spec",description:"* Bundle",source:"@site/docs/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-crds.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/ref-resources"},next:{title:"fleet.yaml",permalink:"/ref-fleet-yaml"}},p={},u=[{value:"Bundle",id:"bundle",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleList",id:"bundlelist",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentList",id:"bundledeploymentlist",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleNamespaceMappingList",id:"bundlenamespacemappinglist",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterList",id:"clusterlist",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupList",id:"clustergrouplist",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationList",id:"clusterregistrationlist",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenList",id:"clusterregistrationtokenlist",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"Content",id:"content",level:4},{value:"ContentList",id:"contentlist",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoList",id:"gitrepolist",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"OCIRegistrySpec",id:"ociregistryspec",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoRestrictionList",id:"gitreporestrictionlist",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanList",id:"imagescanlist",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"FleetYAML",id:"fleetyaml",level:4},{value:"ImageScanYAML",id:"imagescanyaml",level:4}],y={toc:u},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},y,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlelist"},"BundleList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentlist"},"BundleDeploymentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemappinglist"},"BundleNamespaceMappingList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterlist"},"ClusterList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergrouplist"},"ClusterGroupList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationlist"},"ClusterRegistrationList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenlist"},"ClusterRegistrationTokenList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#contentlist"},"ContentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepolist"},"GitRepoList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestrictionlist"},"GitRepoRestrictionList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanlist"},"ImageScanList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#fleetyaml"},"FleetYAML")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanyaml"},"ImageScanYAML"))),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters."),(0,l.yg)("p",null,"When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlelist"},"BundleList"),(0,l.yg)("p",null,"BundleList contains a list of Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundle"},"Bundle")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"contentsId"),(0,l.yg)("td",{parentName:"tr",align:null},"ContentsID stores the contents id when deploying contents using an OCI registry."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociReference"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIReference is the OCI reference used to store contents, this is only for informational purposes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourcesSha256Sum"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentlist"},"BundleDeploymentList"),(0,l.yg)("p",null,"BundleDeploymentList contains a list of BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace can be used to delete the deployed namespace when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteCRDResources"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociContents"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIContents is true when this deployment's contents is stored in an oci registry"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null},"Release is the Helm release ID"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDNS"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to ",(0,l.yg)("inlineCode",{parentName:"td"},"true")," by default."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"skipSchemaValidation"),(0,l.yg)("td",{parentName:"tr",align:null},"SkipSchemaValidation allows skipping schema validation against the chart values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDependencyUpdate"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDependencyUpdate allows skipping chart dependencies update"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"exist"),(0,l.yg)("td",{parentName:"tr",align:null},"Exist is true if the resource exists but is not owned by us. This can happen if a resource was adopted by another bundle whereas the first bundle still exists and due to that reports that it does not own it."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemappinglist"},"BundleNamespaceMappingList"),(0,l.yg)("p",null,"BundleNamespaceMappingList contains a list of BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterlist"},"ClusterList"),(0,l.yg)("p",null,"ClusterList contains a list of Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#cluster"},"Cluster")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecretNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"hostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"HostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration)."),(0,l.yg)("td",{parentName:"tr",align:null},"*bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentHostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTLSMode"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTLSMode supports two values: ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store")," and ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),". If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store"),", instructs the agent to trust CA bundles from the operating system's store. If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),", then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"garbageCollectionInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"GarbageCollectionInterval determines how often agents clean up obsolete Helm releases."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergrouplist"},"ClusterGroupList"),(0,l.yg)("p",null,"ClusterGroupList contains a list of ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationlist"},"ClusterRegistrationList"),(0,l.yg)("p",null,"ClusterRegistrationList contains a list of ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenlist"},"ClusterRegistrationTokenList"),(0,l.yg)("p",null,"ClusterRegistrationTokenList contains a list of ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sha256sum"),(0,l.yg)("td",{parentName:"tr",align:null},"SHA256Sum of the Content field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"contentlist"},"ContentList"),(0,l.yg)("p",null,"ContentList contains a list of Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#content"},"Content")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepolist"},"GitRepoList"),(0,l.yg)("p",null,"GitRepoList contains a list of GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitrepo"},"GitRepo")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePolling"),(0,l.yg)("td",{parentName:"tr",align:null},"Disables git polling. When enabled only webhooks will be used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociRegistry"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIRegistry specifies the OCI registry related parameters"),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"updateGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Update generation is the force update generation if spec.forceSyncGeneration is set"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last git job run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"webhookCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"WebhookCommit is the latest Git commit hash received from a webhook"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last Git job run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastPollingTriggered"),(0,l.yg)("td",{parentName:"tr",align:null},"LastPollingTime is the last time the polling check was triggered"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ociregistryspec"},"OCIRegistrySpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"reference"),(0,l.yg)("td",{parentName:"tr",align:null},"Reference of the OCI Registry"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthSecretName contains the auth secret where the OCI regristry credentials are stored."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"basicHTTP"),(0,l.yg)("td",{parentName:"tr",align:null},"BasicHTTP uses HTTP connections to the OCI registry when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLS"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLS allows connections to OCI registry without certs when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestrictionlist"},"GitRepoRestrictionList"),(0,l.yg)("p",null,"GitRepoRestrictionList contains a list of GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanlist"},"ImageScanList"),(0,l.yg)("p",null,"ImageScanList contains a list of ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescan"},"ImageScan")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"fleetyaml"},"FleetYAML"),(0,l.yg)("p",null,"FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle which will be created."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"labels"),(0,l.yg)("td",{parentName:"tr",align:null},"Labels are copied to the bundle and can be used in a dependsOn.selector."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetCustomizations"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScans"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScans are optional and used to update container image references in the git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescanyaml"},"ImageScanYAML")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overrideTargets"),(0,l.yg)("td",{parentName:"tr",align:null},"OverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanyaml"},"ImageScanYAML"),(0,l.yg)("p",null,"ImageScanYAML is a single entry in the ImageScan list from fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the image scan. Unused."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/de08e76e.a9a5d0a3.js b/assets/js/de08e76e.a9a5d0a3.js new file mode 100644 index 000000000..569349643 --- /dev/null +++ b/assets/js/de08e76e.a9a5d0a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6677],{5680:(e,t,a)=>{a.d(t,{xA:()=>y,yg:()=>o});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=n.createContext({}),u=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},y=function(e){var t=u(e.components);return n.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,y=i(e,["components","mdxType","originalType","parentName"]),m=u(a),d=l,o=m["".concat(p,".").concat(d)]||m[d]||s[d]||r;return a?n.createElement(o,g(g({ref:t},y),{},{components:a})):n.createElement(o,g({ref:t},y))}));function o(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,g[1]=i;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>g,default:()=>s,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"ref-crds",title:"Custom Resources Spec",description:"* Bundle",source:"@site/docs/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-crds.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"List of Deployed Resources",permalink:"/ref-resources"},next:{title:"fleet.yaml",permalink:"/ref-fleet-yaml"}},p={},u=[{value:"Bundle",id:"bundle",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleList",id:"bundlelist",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentList",id:"bundledeploymentlist",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentResource",id:"bundledeploymentresource",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"IgnoreOptions",id:"ignoreoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleNamespaceMappingList",id:"bundlenamespacemappinglist",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterList",id:"clusterlist",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupList",id:"clustergrouplist",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationList",id:"clusterregistrationlist",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenList",id:"clusterregistrationtokenlist",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"Content",id:"content",level:4},{value:"ContentList",id:"contentlist",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"CorrectDrift",id:"correctdrift",level:4},{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoList",id:"gitrepolist",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"OCIRegistrySpec",id:"ociregistryspec",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoRestrictionList",id:"gitreporestrictionlist",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanList",id:"imagescanlist",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"FleetYAML",id:"fleetyaml",level:4},{value:"ImageScanYAML",id:"imagescanyaml",level:4}],y={toc:u},m="wrapper";function s(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},y,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlelist"},"BundleList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentlist"},"BundleDeploymentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemappinglist"},"BundleNamespaceMappingList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterlist"},"ClusterList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergrouplist"},"ClusterGroupList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationlist"},"ClusterRegistrationList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenlist"},"ClusterRegistrationTokenList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#contentlist"},"ContentList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepolist"},"GitRepoList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestrictionlist"},"GitRepoRestrictionList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanlist"},"ImageScanList")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#fleetyaml"},"FleetYAML")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanyaml"},"ImageScanYAML"))),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("p",null,"Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters."),(0,l.yg)("p",null,"When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("p",null,"BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is a summary state for the bundle, calculated over the non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlelist"},"BundleList"),(0,l.yg)("p",null,"BundleList contains a list of Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundle"},"Bundle")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching bundle's labels."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("p",null,"BundleResource represents the content of a single resource from the bundle, like a YAML manifest."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource, can include the bundle's internal path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"The content of the resource, can be compressed."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null},'Encoding is either empty or \\"base64+gz\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleresource"},"BundleResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions is an allow list, which controls if a bundledeployment is created for a target."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"contentsId"),(0,l.yg)("td",{parentName:"tr",align:null},"ContentsID stores the contents id when deploying contents using an OCI registry."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null},"NewlyCreated is the number of bundle deployments that have been created, not updated."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"UnavailablePartitions is the number of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable deployments. See rollout configuration."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"PartitionStatus lists the status of each partition."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc.."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociReference"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIReference is the OCI reference used to store contents, this is only for informational purposes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourcesSha256Sum"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("p",null,"BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of bundle deployments that have been deployed where some resources are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"ErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"OutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of bundle deployments that have been deployed where all resources are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null},"Pending is the number of bundle deployments that are being processed by Fleet controller."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of bundle deployments that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of states, which is filled for a bundle that is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("p",null,"BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},'Name of target. This value is largely for display and logging. If not specified a default name of the format \\"target000\\" will be used'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName to match a specific cluster by name that will be selected"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup to match a specific cluster group by name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a selector to match cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"doNotDeploy"),(0,l.yg)("td",{parentName:"tr",align:null},"DoNotDeploy if set to true, will not deploy to this target."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("p",null,"BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("p",null,'NonReadyResource contains information about a bundle that is not ready for a given state like \\"ErrApplied\\". It contains a list of non-ready or modified resources and their states.'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, like e.g. \\"NotReady\\" or \\"ErrApplied\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains information why the bundle is not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"ModifiedStatus lists the state for each modified resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyStatus lists the state for each non-ready resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("p",null,"Partition defines a separate rollout strategy for a set of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"A user-friendly name given to the partition used for Display (optional)."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"A cluster group name to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector matching cluster group labels to include in this partition"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("p",null,"PartitionStatus is the status of a single rollout partition."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null},"Count is the number of clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxUnavailable is the maximum number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"Unavailable is the number of unavailable clusters in the partition."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary state for the partition, calculated over its non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("p",null,"ResourceKey lists resources, which will likely be deployed."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s api kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the k8s api version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("p",null,"RolloverStrategy controls the rollout of the bundle across clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null},"A number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%"),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null},"A list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#partition"},"Partition")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("p",null,"BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentlist"},"BundleDeploymentList"),(0,l.yg)("p",null,"BundleDeploymentList contains a list of BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace can be used to delete the deployed namespace when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ignore"),(0,l.yg)("td",{parentName:"tr",align:null},"IgnoreOptions can be used to ignore fields when monitoring the bundle."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#ignoreoptions"},"IgnoreOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceLabels are labels that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceAnnotations"),(0,l.yg)("td",{parentName:"tr",align:null},"NamespaceAnnotations are annotations that will be appended to the namespace created by Fleet."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteCRDResources"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentresource"},"BundleDeploymentResource"),(0,l.yg)("p",null,"BundleDeploymentResource contains the metadata of a deployed resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"createdAt"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedOptions are the deployment options, that are staged for the next deployment."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"StagedDeploymentID is the ID of the staged deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null},"Options are the deployment options, that are currently applied."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null},"DeploymentID is the ID of the currently applied deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundleref"},"BundleRef")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociContents"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIContents is true when this deployment's contents is stored in an oci registry"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null},"Release is the Helm release ID"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources lists the metadata of resources that were deployed according to the helm release history."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentresource"},"BundleDeploymentResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("p",null,"ComparePatch matches a resource and removes fields from the check for modifications."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the kind of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the apiVersion of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace is the namespace of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of the resource to match."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null},"Operations remove a JSON path from the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#operation"},"Operation")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null},"JSONPointers ignore diffs at a certain JSON path."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null},"ComparePatches match a resource and remove fields from the check for modifications."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("p",null,"HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDNS"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to ",(0,l.yg)("inlineCode",{parentName:"td"},"true")," by default."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"skipSchemaValidation"),(0,l.yg)("td",{parentName:"tr",align:null},"SkipSchemaValidation allows skipping schema validation against the chart values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disableDependencyUpdate"),(0,l.yg)("td",{parentName:"tr",align:null},"DisableDependencyUpdate allows skipping chart dependencies update"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ignoreoptions"},"IgnoreOptions"),(0,l.yg)("p",null,"IgnoreOptions defines conditions to be ignored when monitoring the Bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions to be ignored when monitoring the Bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[]map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("p",null,"KustomizeOptions for a deployment."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null},"Dir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of a resource in the same namespace as the referent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("p",null,"ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"exist"),(0,l.yg)("td",{parentName:"tr",align:null},"Exist is true if the resource exists but is not owned by us. This can happen if a resource was adopted by another bundle whereas the first bundle still exists and due to that reports that it does not own it."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("p",null,"NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("p",null,'Operation of a ComparePatch, usually \\"remove\\".'),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null},'Op is usually \\"remove\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null},"Path is the JSON path to remove."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null},"Value is usually empty."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("p",null,"YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null},'Overlays is a list of names that maps to folders in \\"overlays/\\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("p",null,"BundleNamespaceMapping maps bundles to clusters in other namespaces."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemappinglist"},"BundleNamespaceMappingList"),(0,l.yg)("p",null,"BundleNamespaceMappingList contains a list of BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSeen is the last time the agent checked in to update the status of the cluster resource."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the namespace of the agent deployment, e.g. \\"cattle-fleet-system\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("p",null,"Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet Kubernetes cluster is both the manager and downstream cluster at the same time."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State of the cluster, either one of the bundle states, or \\"WaitCheckIn\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterlist"},"ClusterList"),(0,l.yg)("p",null,"ClusterList contains a list of Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#cluster"},"Cluster")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecretNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]corev1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinity"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.Affinity"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResources"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResources sets the resources for the cluster's agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.ResourceRequirements"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"hostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"HostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration)."),(0,l.yg)("td",{parentName:"tr",align:null},"*bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts is an aggregate over the GitRepoResourceCounts."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyGitRepos is the number of gitrepos for this cluster that are ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVarsHash is a hash of the agent's env vars, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentPrivateRepoURL is the private repo URL for the agent that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentHostNetwork"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentDeployedGeneration is the generation of the agent that is currently deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null},"CattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentAffinityHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentResourcesHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentResourcesHash is a hash of the agent's resources configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerationsHash"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentConfigChanged"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerURL"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiServerCAHash"),(0,l.yg)("td",{parentName:"tr",align:null},"APIServerCAHash is a hash of the upstream API server CA, used to detect changes."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTLSMode"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTLSMode supports two values: ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store")," and ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),". If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"system-store"),", instructs the agent to trust CA bundles from the operating system's store. If set to ",(0,l.yg)("inlineCode",{parentName:"td"},"strict"),", then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready bundles, nodes and a summary state."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentStatus contains information about the agent."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"garbageCollectionInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"GarbageCollectionInterval determines how often agents clean up obsolete Helm releases."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("p",null,"ClusterGroup is a re-usable selector to target a group of clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyClusters is a string in the form \\"%d/%d\\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundles is a string in the form \\"%d/%d\\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is a summary state for the cluster group, showing \\"NotReady\\" if there are non-ready resources.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergrouplist"},"ClusterGroupList"),(0,l.yg)("p",null,"ClusterGroupList contains a list of ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null},"Selector is a label selector, used to select clusters for this group."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterCount is the number of clusters in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusterCount is the number of clusters that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"NonReadyClusters is a list of cluster names that are not ready."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of conditions and their statuses for the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary is a summary of the bundle deployments and their resources in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains the number of ready, desiredready clusters and a summary state for the bundle's resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles in the cluster group."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("p",null,"ClusterRegistration is used internally by Fleet and should not be used directly."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationlist"},"ClusterRegistrationList"),(0,l.yg)("p",null,"ClusterRegistrationList contains a list of ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterLabels are copied to the cluster resource during the registration."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is only set after the registration is being processed by fleet-controller."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null},"Granted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("p",null,"ClusterRegistrationToken is used by agents to register a new cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenlist"},"ClusterRegistrationTokenList"),(0,l.yg)("p",null,"ClusterRegistrationTokenList contains a list of ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtoken"},"ClusterRegistrationToken")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null},"TTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null},"Expires is the time when the token expires."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretName is the name of the secret containing the token."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("p",null,"Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null},"Content is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sha256sum"),(0,l.yg)("td",{parentName:"tr",align:null},"SHA256Sum of the Content field"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"contentlist"},"ContentList"),(0,l.yg)("p",null,"ContentList contains a list of Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#content"},"Content")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"correctdrift"},"CorrectDrift"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"enabled"),(0,l.yg)("td",{parentName:"tr",align:null},"Enabled correct drift if true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force helm rollback with --force option will be used if true. This will try to recreate all resources in the release."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepFailHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepFailHistory keeps track of failed rollbacks in the helm history."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("p",null,"GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null},'ReadyBundleDeployments is a string in the form \\"%d/%d\\", that describes the number of ready bundledeployments over the total number of bundledeployments.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the GitRepo, e.g. \\"GitUpdating\\" or the maximal BundleState according to StateRank.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message contains the relevant message from the deployment conditions."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if a message is present."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepolist"},"GitRepoList"),(0,l.yg)("p",null,"GitRepoList contains a list of GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitrepo"},"GitRepo")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("p",null,"GitRepoResource contains metadata about the resources of a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null},"APIVersion is the API version of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null},"Kind is the k8s kind of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null},'Type is the type of the resource, e.g. \\"apiextensions.k8s.io.customresourcedefinition\\" or \\"configmap\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null},'ID is the name of the resource, e.g. \\"namespace1/my-config\\" or \\"backingimagemanagers.storage.io\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Namespace of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null},"IncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},'State is the state of the resource, e.g. \\"Unknown\\", \\"WaitApplied\\", \\"ErrApplied\\" or \\"Ready\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if any Error in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if any Transitioning in the PerClusterState is true."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message is the first message from the PerClusterStates."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null},"PerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("p",null,"GitRepoResourceCounts contains the number of resources in each state."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null},"Ready is the number of ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReady is the number of resources that should be ready."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitApplied is the number of resources that are waiting to be applied."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null},"Modified is the number of resources that have been modified."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null},"Orphaned is the number of orphaned resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null},"Missing is the number of missing resources."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null},"Unknown is the number of resources in an unknown state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null},"NotReady is the number of not ready resources. Resources are not ready if they do not match any other state."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for a private Helm repository."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretNameForPaths"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretNameForPaths contains the auth secret for private Helm repository for each path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default.'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of targets this repo will deploy to."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when a new image is scanned and written back to git repo."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deleteNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"correctDrift"),(0,l.yg)("td",{parentName:"tr",align:null},"CorrectDrift specifies how drift correction should work."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#correctdrift"},"CorrectDrift")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePolling"),(0,l.yg)("td",{parentName:"tr",align:null},"Disables git polling. When enabled only webhooks will be used."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ociRegistry"),(0,l.yg)("td",{parentName:"tr",align:null},"OCIRegistry specifies the OCI registry related parameters"),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#ociregistryspec"},"OCIRegistrySpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"updateGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Update generation is the force update generation if spec.forceSyncGeneration is set"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit is the Git commit hash from the last git job run."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"webhookCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"WebhookCommit is the latest Git commit hash received from a webhook"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"ReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null},"DesiredReadyClusters\\tis the number of clusters that should be ready for bundles of this GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null},'GitJobStatus is the status of the last Git job run, e.g. \\"Current\\" if there was no error.'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null},"Summary contains the number of bundle deployments in each state and a list of non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null},"Display contains a human readable summary of the status."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null},"Conditions is a list of Wrangler conditions that describe the state of the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contains metadata about the resources of each bundle."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceCounts contains the number of resources in each state over all bundles."),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null},"ResourceErrors is a sorted list of errors from the resources."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastSyncedImageScanTime is the time of the last image scan."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastPollingTriggered"),(0,l.yg)("td",{parentName:"tr",align:null},"LastPollingTime is the last time the polling check was triggered"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("p",null,"GitTarget is a cluster or cluster group to deploy to."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name is the name of this target."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterName is the name of a cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterSelector is a label selector to select clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroup is the name of a cluster group in the same namespace as the clusters."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterGroupSelector is a label selector to select cluster groups."),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"ociregistryspec"},"OCIRegistrySpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"reference"),(0,l.yg)("td",{parentName:"tr",align:null},"Reference of the OCI Registry"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthSecretName contains the auth secret where the OCI regristry credentials are stored."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"basicHTTP"),(0,l.yg)("td",{parentName:"tr",align:null},"BasicHTTP uses HTTP connections to the OCI registry when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLS"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLS allows connections to OCI registry without certs when enabled."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("p",null,"ResourcePerClusterState is generated for each non-ready resource of the bundles."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null},"State is the state of the resource."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null},"Error is true if the resource is in an error state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null},"Transitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null},"Message combines the messages from the bundle's summary. Messages are joined with the delimiter ';'."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null},"Patch for modified resources."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null},"ClusterID is the id of the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("p",null,"GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultServiceAccount overrides the GitRepo's default service account."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultClientSecretName overrides the GitRepo's default client secret."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null},"AllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestrictionlist"},"GitRepoRestrictionList"),(0,l.yg)("p",null,"GitRepoRestrictionList contains a list of GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanlist"},"ImageScanList"),(0,l.yg)("p",null,"ImageScanList contains a list of ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ListMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"items"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescan"},"ImageScan")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"fleetyaml"},"FleetYAML"),(0,l.yg)("p",null,"FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the bundle which will be created."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"labels"),(0,l.yg)("td",{parentName:"tr",align:null},"Labels are copied to the bundle and can be used in a dependsOn.selector."),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetCustomizations"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScans"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScans are optional and used to update container image references in the git repo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#imagescanyaml"},"ImageScanYAML")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overrideTargets"),(0,l.yg)("td",{parentName:"tr",align:null},"OverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo."),(0,l.yg)("td",{parentName:"tr",align:null},"[","]",(0,l.yg)("a",{parentName:"td",href:"#gittarget"},"GitTarget")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanyaml"},"ImageScanYAML"),(0,l.yg)("p",null,"ImageScanYAML is a single entry in the ImageScan list from fleet.yaml."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null},"Name of the image scan. Unused."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanSpec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources-spec"},"Back to Custom Resources")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/de69e49e.b0af1a34.js b/assets/js/de69e49e.593f536e.js similarity index 61% rename from assets/js/de69e49e.b0af1a34.js rename to assets/js/de69e49e.593f536e.js index bf95277c8..f9558685e 100644 --- a/assets/js/de69e49e.b0af1a34.js +++ b/assets/js/de69e49e.593f536e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6368],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=p(n),d=l,m=u["".concat(c,".").concat(d)]||u[d]||f[d]||a;return n?r.createElement(m,o(o({ref:t},s),{},{components:n})):r.createElement(m,o({ref:t},s))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet cleanup"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_cleanup",id:"version-0.9/cli/fleet-cli/fleet_cleanup",title:"",description:"fleet cleanup",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet_cleanup.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_cleanup",permalink:"/0.9/cli/fleet-cli/fleet_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet_cleanup.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet cleanup"}},c={},p=[{value:"fleet cleanup",id:"fleet-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:p},u="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-cleanup"},"fleet cleanup"),(0,l.yg)("p",null,"Clean up outdated cluster registrations"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet cleanup [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --factor string Factor to increase delay between deletes (default: 1.1)\n -h, --help help for cleanup\n --max string Maximum delay between deletes (default: 5s)\n --min string Minimum delay between deletes (default: 10ms)\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6368],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=p(n),d=l,m=u["".concat(c,".").concat(d)]||u[d]||f[d]||a;return n?r.createElement(m,o(o({ref:t},s),{},{components:n})):r.createElement(m,o({ref:t},s))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var r=n(8168),l=(n(6540),n(5680));const a={title:"",sidebar_label:"fleet cleanup"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet_cleanup",id:"version-0.9/cli/fleet-cli/fleet_cleanup",title:"",description:"fleet cleanup",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet_cleanup.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_cleanup",permalink:"/0.9/cli/fleet-cli/fleet_cleanup",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet_cleanup.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet cleanup"}},c={},p=[{value:"fleet cleanup",id:"fleet-cleanup",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:p},u="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-cleanup"},"fleet cleanup"),(0,l.yg)("p",null,"Clean up outdated cluster registrations"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet cleanup [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --factor string Factor to increase delay between deletes (default: 1.1)\n -h, --help help for cleanup\n --max string Maximum delay between deletes (default: 5s)\n --min string Minimum delay between deletes (default: 10ms)\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/de6c661b.376d6e74.js b/assets/js/de6c661b.376d6e74.js new file mode 100644 index 000000000..aa4d90b23 --- /dev/null +++ b/assets/js/de6c661b.376d6e74.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6942],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var n in t)hasOwnProperty.call(t,n)&&(o[n]=t[n]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.9.0",date:"2023-11-07 12:30:45 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.9.0",id:"version-0.9/changelogs/changelogs/v0.9.0",title:"v0.9.0",description:"(rancherio-gh-m) released this 2023-11-07 1245 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.0",permalink:"/0.9/changelogs/changelogs/v0.9.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.0.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.9.0",date:"2023-11-07 12:30:45 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.9/troubleshooting"},next:{title:"v0.9.1",permalink:"/0.9/changelogs/changelogs/v0.9.1"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-11-07 12:30:45 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"Fleet 0.9 contains major ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.1.96"},"changes to Gitjob"),". The existing git handling code has been unified and now uses the go-git library. The tekton CLI, which was used for cloning, has been removed. The release improves the performance on downstream clusters, by using a caching client with the helm SDK."),(0,l.yg)("h2",null,"Known Issues"),(0,l.yg)("ul",null,(0,l.yg)("li",null,'Gitjob might report "git binary not found" if the path within the repository does not exist. ',(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1979967973","data-permission-text":"Title is private","data-url":"https://github.com/rancher/rancher/issues/43499","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/43499/hovercard",href:"https://github.com/rancher/rancher/issues/43499"},"rancher/rancher#43499"))),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add helm version to capabilities by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1865337733","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1743","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1743/hovercard",href:"https://github.com/rancher/fleet/pull/1743"},"#1743")),(0,l.yg)("li",null,"Add support for spec field identifying KUBECONFIG namespace for imported clusters by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aiyengar2/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aiyengar2"},"@aiyengar2")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1895090256","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1786","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1786/hovercard",href:"https://github.com/rancher/fleet/pull/1786"},"#1786")),(0,l.yg)("li",null,"Allow configuring EnableDNS property in Helm through fleet.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1880067882","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1755","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1755/hovercard",href:"https://github.com/rancher/fleet/pull/1755"},"#1755")),(0,l.yg)("li",null,"Allow skipping Helm's schema validation through fleet.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1890208383","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1769","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1769/hovercard",href:"https://github.com/rancher/fleet/pull/1769"},"#1769")),(0,l.yg)("li",null,"Document public API by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1793509578","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1639","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1639/hovercard",href:"https://github.com/rancher/fleet/pull/1639"},"#1639")),(0,l.yg)("li",null,"Add descriptions to CRDs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1909188933","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1798","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1798/hovercard",href:"https://github.com/rancher/fleet/pull/1798"},"#1798")),(0,l.yg)("li",null,"Helm Storage Backend With Caching by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1913619136","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1809","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1809/hovercard",href:"https://github.com/rancher/fleet/pull/1809"},"#1809")),(0,l.yg)("li",null,"Include nonResourceURLs Fleet-Agent's RBAC by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1911427587","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1806","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1806/hovercard",href:"https://github.com/rancher/fleet/pull/1806"},"#1806"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add SecurityContext to job container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1947343283","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1878","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1878/hovercard",href:"https://github.com/rancher/fleet/pull/1878"},"#1878")),(0,l.yg)("li",null,"Incorrect agent's DebugLevel when settings propagation is set by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1891871949","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1776","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1776/hovercard",href:"https://github.com/rancher/fleet/pull/1776"},"#1776")),(0,l.yg)("li",null,"Initialise cluster registration labels map if empty by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1921679910","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1832","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1832/hovercard",href:"https://github.com/rancher/fleet/pull/1832"},"#1832")),(0,l.yg)("li",null,"Pin version of k8s.io/dynamic-resource-allocation by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1880022451","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1754","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1754/hovercard",href:"https://github.com/rancher/fleet/pull/1754"},"#1754"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add dev scripts to simplify using E2E tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1887260697","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1764","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1764/hovercard",href:"https://github.com/rancher/fleet/pull/1764"},"#1764")),(0,l.yg)("li",null,"Add integration test to verify fleet.yaml helm options for non-helm type bundles by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1891774210","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1775","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1775/hovercard",href:"https://github.com/rancher/fleet/pull/1775"},"#1775")),(0,l.yg)("li",null,"CI: Retry on context deadline exceeded by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1896515940","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1788","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1788/hovercard",href:"https://github.com/rancher/fleet/pull/1788"},"#1788")),(0,l.yg)("li",null,"Document APIServerURL in the config by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1905121773","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1795","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1795/hovercard",href:"https://github.com/rancher/fleet/pull/1795"},"#1795")),(0,l.yg)("li",null,"E2E: Fix flaky single cluster tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1894739307","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1784","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1784/hovercard",href:"https://github.com/rancher/fleet/pull/1784"},"#1784")),(0,l.yg)("li",null,"E2E: Increase testenv reliability by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1842980334","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1704","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1704/hovercard",href:"https://github.com/rancher/fleet/pull/1704"},"#1704")),(0,l.yg)("li",null,"Fix nightly image build workflow YAML by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1881504909","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1758","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1758/hovercard",href:"https://github.com/rancher/fleet/pull/1758"},"#1758")),(0,l.yg)("li",null,"Fix patch_crd_descriptions.sh when yq is not installed by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1915165661","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1810","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1810/hovercard",href:"https://github.com/rancher/fleet/pull/1810"},"#1810")),(0,l.yg)("li",null,"Fixes for running multi cluster E2E tests locally by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1885365675","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1762","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1762/hovercard",href:"https://github.com/rancher/fleet/pull/1762"},"#1762")),(0,l.yg)("li",null,"Fix CA variable usage in dev/setup-fleet by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1887587973","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1766","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1766/hovercard",href:"https://github.com/rancher/fleet/pull/1766"},"#1766")),(0,l.yg)("li",null,"Improve release scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1885179052","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1761","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1761/hovercard",href:"https://github.com/rancher/fleet/pull/1761"},"#1761")),(0,l.yg)("li",null,"Increase speed of clusterregistration clean up hook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1848103589","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1712","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1712/hovercard",href:"https://github.com/rancher/fleet/pull/1712"},"#1712")),(0,l.yg)("li",null,"Remove previous version selection in release against rancher script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1890926992","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1773","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1773/hovercard",href:"https://github.com/rancher/fleet/pull/1773"},"#1773")),(0,l.yg)("li",null,"Remove Tekton references from release docs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1924215600","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1833","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1833/hovercard",href:"https://github.com/rancher/fleet/pull/1833"},"#1833")),(0,l.yg)("li",null,"Remove tekton by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1894002420","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1782","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1782/hovercard",href:"https://github.com/rancher/fleet/pull/1782"},"#1782")),(0,l.yg)("li",null,"Retry k3d image import in workflows by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1900858611","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1793","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1793/hovercard",href:"https://github.com/rancher/fleet/pull/1793"},"#1793")),(0,l.yg)("li",null,"Simplify Golang version management by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/olblak/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/olblak"},"@olblak")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1849398421","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1714","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1714/hovercard",href:"https://github.com/rancher/fleet/pull/1714"},"#1714")),(0,l.yg)("li",null,"Switch k3d import to default mode to detect error in e2e setup by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1906606681","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1797","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1797/hovercard",href:"https://github.com/rancher/fleet/pull/1797"},"#1797")),(0,l.yg)("li",null,"Testenv infra uses local fleet module by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1880359232","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1756","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1756/hovercard",href:"https://github.com/rancher/fleet/pull/1756"},"#1756")),(0,l.yg)("li",null,"Update README.md with instructions on how to use nektos/act by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1887498534","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1765","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1765/hovercard",href:"https://github.com/rancher/fleet/pull/1765"},"#1765")),(0,l.yg)("li",null,"Upgrade k3d k8s versions in CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1892829180","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1780","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1780/hovercard",href:"https://github.com/rancher/fleet/pull/1780"},"#1780")),(0,l.yg)("li",null,"Use constants for agent cluster role names by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1917478538","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1814","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1814/hovercard",href:"https://github.com/rancher/fleet/pull/1814"},"#1814")),(0,l.yg)("li",null,"Go K8s related security bumps by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1846648167","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1709","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1709/hovercard",href:"https://github.com/rancher/fleet/pull/1709"},"#1709")),(0,l.yg)("li",null,"Bump Golang to 1.21.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1850957044","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1716","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1716/hovercard",href:"https://github.com/rancher/fleet/pull/1716"},"#1716")),(0,l.yg)("li",null,"Bump all modules by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1865428989","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1745","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1745/hovercard",href:"https://github.com/rancher/fleet/pull/1745"},"#1745")),(0,l.yg)("li",null,"Bump bci/bci-base from 15.5.36.5.33 to 15.5.36.5.34 in /package by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1910700933","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1805","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1805/hovercard",href:"https://github.com/rancher/fleet/pull/1805"},"#1805")),(0,l.yg)("li",null,"Bump github.com/evanphx/json-patch from 5.6.0+incompatible to 5.7.0+incompatible by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1910694235","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1802","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1802/hovercard",href:"https://github.com/rancher/fleet/pull/1802"},"#1802"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.0...v0.9.0"},(0,l.yg)("tt",null,"v0.8.0...v0.9.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-crd-0.9.0.tgz"},"fleet-crd-0.9.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-agent-0.9.0.tgz"},"fleet-agent-0.9.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-0.9.0.tgz"},"fleet-0.9.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/de6c661b.43b4fb8a.js b/assets/js/de6c661b.43b4fb8a.js deleted file mode 100644 index 74cd6685a..000000000 --- a/assets/js/de6c661b.43b4fb8a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6942],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>m});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var n=r.createContext({}),c=function(e){var t=r.useContext(n),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(n.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,n=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),h=c(a),p=l,m=h["".concat(n,".").concat(p)]||h[p]||u[p]||s;return a?r.createElement(m,i(i({ref:t},d),{},{components:a})):r.createElement(m,i({ref:t},d))}));function m(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,i=new Array(s);i[0]=p;var o={};for(var n in t)hasOwnProperty.call(t,n)&&(o[n]=t[n]);o.originalType=e,o[h]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>n,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const s={title:"v0.9.0",date:"2023-11-07 12:30:45 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.9.0",id:"version-0.9/changelogs/changelogs/v0.9.0",title:"v0.9.0",description:"(rancherio-gh-m) released this 2023-11-07 1245 +0000 UTC",source:"@site/versioned_docs/version-0.9/changelogs/changelogs/v0.9.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.9.0",permalink:"/0.9/changelogs/changelogs/v0.9.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/changelogs/changelogs/v0.9.0.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.9.0",date:"2023-11-07 12:30:45 +0000 UTC"},sidebar:"docs",previous:{title:"Troubleshooting",permalink:"/0.9/troubleshooting"},next:{title:"v0.9.1",permalink:"/0.9/changelogs/changelogs/v0.9.1"}},n={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function u(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2023-11-07 12:30:45 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("p",null,"Fleet 0.9 contains major ",(0,l.yg)("a",{href:"https://github.com/rancher/gitjob/releases/tag/v0.1.96"},"changes to Gitjob"),". The existing git handling code has been unified and now uses the go-git library. The tekton CLI, which was used for cloning, has been removed. The release improves the performance on downstream clusters, by using a caching client with the helm SDK."),(0,l.yg)("h2",null,"Known Issues"),(0,l.yg)("ul",null,(0,l.yg)("li",null,'Gitjob might report "git binary not found" if the path within the repository does not exist. ',(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1979967973","data-permission-text":"Title is private","data-url":"https://github.com/rancher/rancher/issues/43499","data-hovercard-type":"issue","data-hovercard-url":"/rancher/rancher/issues/43499/hovercard",href:"https://github.com/rancher/rancher/issues/43499"},"rancher/rancher#43499"))),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add helm version to capabilities by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1865337733","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1743","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1743/hovercard",href:"https://github.com/rancher/fleet/pull/1743"},"#1743")),(0,l.yg)("li",null,"Add support for spec field identifying KUBECONFIG namespace for imported clusters by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aiyengar2/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aiyengar2"},"@aiyengar2")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1895090256","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1786","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1786/hovercard",href:"https://github.com/rancher/fleet/pull/1786"},"#1786")),(0,l.yg)("li",null,"Allow configuring EnableDNS property in Helm through fleet.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1880067882","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1755","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1755/hovercard",href:"https://github.com/rancher/fleet/pull/1755"},"#1755")),(0,l.yg)("li",null,"Allow skipping Helm's schema validation through fleet.yaml by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1890208383","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1769","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1769/hovercard",href:"https://github.com/rancher/fleet/pull/1769"},"#1769")),(0,l.yg)("li",null,"Document public API by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1793509578","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1639","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1639/hovercard",href:"https://github.com/rancher/fleet/pull/1639"},"#1639")),(0,l.yg)("li",null,"Add descriptions to CRDs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1909188933","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1798","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1798/hovercard",href:"https://github.com/rancher/fleet/pull/1798"},"#1798")),(0,l.yg)("li",null,"Helm Storage Backend With Caching by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1913619136","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1809","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1809/hovercard",href:"https://github.com/rancher/fleet/pull/1809"},"#1809")),(0,l.yg)("li",null,"Include nonResourceURLs Fleet-Agent's RBAC by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1911427587","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1806","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1806/hovercard",href:"https://github.com/rancher/fleet/pull/1806"},"#1806"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add SecurityContext to job container by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1947343283","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1878","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1878/hovercard",href:"https://github.com/rancher/fleet/pull/1878"},"#1878")),(0,l.yg)("li",null,"Incorrect agent's DebugLevel when settings propagation is set by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1891871949","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1776","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1776/hovercard",href:"https://github.com/rancher/fleet/pull/1776"},"#1776")),(0,l.yg)("li",null,"Initialise cluster registration labels map if empty by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1921679910","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1832","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1832/hovercard",href:"https://github.com/rancher/fleet/pull/1832"},"#1832")),(0,l.yg)("li",null,"Pin version of k8s.io/dynamic-resource-allocation by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1880022451","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1754","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1754/hovercard",href:"https://github.com/rancher/fleet/pull/1754"},"#1754"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add dev scripts to simplify using E2E tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1887260697","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1764","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1764/hovercard",href:"https://github.com/rancher/fleet/pull/1764"},"#1764")),(0,l.yg)("li",null,"Add integration test to verify fleet.yaml helm options for non-helm type bundles by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1891774210","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1775","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1775/hovercard",href:"https://github.com/rancher/fleet/pull/1775"},"#1775")),(0,l.yg)("li",null,"CI: Retry on context deadline exceeded by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1896515940","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1788","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1788/hovercard",href:"https://github.com/rancher/fleet/pull/1788"},"#1788")),(0,l.yg)("li",null,"Document APIServerURL in the config by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1905121773","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1795","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1795/hovercard",href:"https://github.com/rancher/fleet/pull/1795"},"#1795")),(0,l.yg)("li",null,"E2E: Fix flaky single cluster tests by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1894739307","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1784","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1784/hovercard",href:"https://github.com/rancher/fleet/pull/1784"},"#1784")),(0,l.yg)("li",null,"E2E: Increase testenv reliability by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1842980334","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1704","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1704/hovercard",href:"https://github.com/rancher/fleet/pull/1704"},"#1704")),(0,l.yg)("li",null,"Fix nightly image build workflow YAML by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1881504909","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1758","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1758/hovercard",href:"https://github.com/rancher/fleet/pull/1758"},"#1758")),(0,l.yg)("li",null,"Fix patch_crd_descriptions.sh when yq is not installed by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1915165661","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1810","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1810/hovercard",href:"https://github.com/rancher/fleet/pull/1810"},"#1810")),(0,l.yg)("li",null,"Fixes for running multi cluster E2E tests locally by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1885365675","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1762","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1762/hovercard",href:"https://github.com/rancher/fleet/pull/1762"},"#1762")),(0,l.yg)("li",null,"Fix CA variable usage in dev/setup-fleet by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1887587973","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1766","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1766/hovercard",href:"https://github.com/rancher/fleet/pull/1766"},"#1766")),(0,l.yg)("li",null,"Improve release scripts by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1885179052","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1761","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1761/hovercard",href:"https://github.com/rancher/fleet/pull/1761"},"#1761")),(0,l.yg)("li",null,"Increase speed of clusterregistration clean up hook by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1848103589","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1712","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1712/hovercard",href:"https://github.com/rancher/fleet/pull/1712"},"#1712")),(0,l.yg)("li",null,"Remove previous version selection in release against rancher script by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1890926992","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1773","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1773/hovercard",href:"https://github.com/rancher/fleet/pull/1773"},"#1773")),(0,l.yg)("li",null,"Remove Tekton references from release docs by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1924215600","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1833","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1833/hovercard",href:"https://github.com/rancher/fleet/pull/1833"},"#1833")),(0,l.yg)("li",null,"Remove tekton by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1894002420","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1782","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1782/hovercard",href:"https://github.com/rancher/fleet/pull/1782"},"#1782")),(0,l.yg)("li",null,"Retry k3d image import in workflows by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1900858611","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1793","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1793/hovercard",href:"https://github.com/rancher/fleet/pull/1793"},"#1793")),(0,l.yg)("li",null,"Simplify Golang version management by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/olblak/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/olblak"},"@olblak")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1849398421","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1714","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1714/hovercard",href:"https://github.com/rancher/fleet/pull/1714"},"#1714")),(0,l.yg)("li",null,"Switch k3d import to default mode to detect error in e2e setup by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1906606681","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1797","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1797/hovercard",href:"https://github.com/rancher/fleet/pull/1797"},"#1797")),(0,l.yg)("li",null,"Testenv infra uses local fleet module by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1880359232","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1756","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1756/hovercard",href:"https://github.com/rancher/fleet/pull/1756"},"#1756")),(0,l.yg)("li",null,"Update README.md with instructions on how to use nektos/act by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/p-se/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/p-se"},"@p-se")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1887498534","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1765","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1765/hovercard",href:"https://github.com/rancher/fleet/pull/1765"},"#1765")),(0,l.yg)("li",null,"Upgrade k3d k8s versions in CI by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1892829180","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1780","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1780/hovercard",href:"https://github.com/rancher/fleet/pull/1780"},"#1780")),(0,l.yg)("li",null,"Use constants for agent cluster role names by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1917478538","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1814","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1814/hovercard",href:"https://github.com/rancher/fleet/pull/1814"},"#1814")),(0,l.yg)("li",null,"Go K8s related security bumps by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1846648167","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1709","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1709/hovercard",href:"https://github.com/rancher/fleet/pull/1709"},"#1709")),(0,l.yg)("li",null,"Bump Golang to 1.21.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1850957044","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1716","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1716/hovercard",href:"https://github.com/rancher/fleet/pull/1716"},"#1716")),(0,l.yg)("li",null,"Bump all modules by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1865428989","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1745","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1745/hovercard",href:"https://github.com/rancher/fleet/pull/1745"},"#1745")),(0,l.yg)("li",null,"Bump bci/bci-base from 15.5.36.5.33 to 15.5.36.5.34 in /package by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1910700933","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1805","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1805/hovercard",href:"https://github.com/rancher/fleet/pull/1805"},"#1805")),(0,l.yg)("li",null,"Bump github.com/evanphx/json-patch from 5.6.0+incompatible to 5.7.0+incompatible by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"organization","data-hovercard-url":"/orgs/dependabot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/dependabot"},"@dependabot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1910694235","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1802","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1802/hovercard",href:"https://github.com/rancher/fleet/pull/1802"},"#1802"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.0...v0.9.0"},(0,l.yg)("tt",null,"v0.8.0...v0.9.0"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-crd-0.9.0.tgz"},"fleet-crd-0.9.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-agent-0.9.0.tgz"},"fleet-agent-0.9.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-0.9.0.tgz"},"fleet-0.9.0.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.9.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.9.0"},"here"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dfa3dc49.23fe8ce9.js b/assets/js/dfa3dc49.23fe8ce9.js deleted file mode 100644 index 7ed9a27af..000000000 --- a/assets/js/dfa3dc49.23fe8ce9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3851],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},4171:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/docs/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/tut-deployment.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/quickstart"},next:{title:"Uninstall",permalink:"/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{a.d(t,{A:()=>s});var l=a(6540),n=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return l.createElement("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>T});var l=a(8168),n=a(6540),r=a(53),s=a(3104),o=a(6347),i=a(7485),u=a(1682),m=a(9466);function p(e){return function(e){return n.Children.map(e,(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:l,default:n}}=e;return{value:t,label:a,attributes:l,default:n}}))}function c(e){const{values:t,children:a}=e;return(0,n.useMemo)((()=>{const e=t??p(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function d(e){let{queryString:t=!1,groupId:a}=e;const l=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,i.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(l.location.search);t.set(r,e),l.replace({...l.location,search:t.toString()})}),[r,l])]}function y(e){const{defaultValue:t,queryString:a=!1,groupId:l}=e,r=c(e),[s,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const l=a.find((e=>e.default))??a[0];if(!l)throw new Error("Unexpected error: 0 tabValues");return l.value}({defaultValue:t,tabValues:r}))),[i,u]=d({queryString:a,groupId:l}),[p,y]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[l,r]=(0,m.Dv)(a);return[l,(0,n.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:l}),g=(()=>{const e=i??p;return h({value:e,tabValues:r})?e:null})();(0,n.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,n.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),y(e)}),[u,y,r]),tabValues:r}}var g=a(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:o,selectValue:i,tabValues:u}=e;const m=[],{blockElementScrollPositionUntilNextRender:p}=(0,s.a_)(),c=e=>{const t=e.currentTarget,a=m.indexOf(t),l=u[a].value;l!==o&&(p(t),i(l))},h=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=m.indexOf(e.currentTarget)+1;t=m[a]??m[0];break}case"ArrowLeft":{const a=m.indexOf(e.currentTarget)-1;t=m[a]??m[m.length-1];break}}t?.focus()};return n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return n.createElement("li",(0,l.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>m.push(e),onKeyDown:h,onClick:c},s,{className:(0,r.A)("tabs__item",f.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:l}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===l));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return n.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==l}))))}function w(e){const t=y(e);return n.createElement("div",{className:(0,r.A)("tabs-container",f.tabList)},n.createElement(b,(0,l.A)({},e,t)),n.createElement(v,(0,l.A)({},e,t)))}function T(e){const t=(0,g.A)();return n.createElement(w,(0,l.A)({key:String(t)},e))}},4171:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>u,default:()=>y,frontMatter:()=>i,metadata:()=>m,toc:()=>c});var l=a(8168),n=(a(6540),a(5680)),r=a(2355),s=a(1470),o=a(9365);const i={},u="Creating a Deployment",m={unversionedId:"tut-deployment",id:"tut-deployment",title:"Creating a Deployment",description:"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it.",source:"@site/docs/tut-deployment.md",sourceDirName:".",slug:"/tut-deployment",permalink:"/tut-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/tut-deployment.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Quick Start",permalink:"/quickstart"},next:{title:"Uninstall",permalink:"/uninstall"}},p={},c=[{value:"Single-Cluster Examples",id:"single-cluster-examples",level:2},{value:"Multi-Cluster Examples",id:"multi-cluster-examples",level:2}],h={toc:c},d="wrapper";function y(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,l.A)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"creating-a-deployment"},"Creating a Deployment"),(0,n.yg)("p",null,"To deploy workloads onto downstream clusters, first create a Git repo, then create a GitRepo resource and apply it."),(0,n.yg)("p",null,"This tutorial uses the ",(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples"},"fleet-examples")," repository."),(0,n.yg)("admonition",{type:"note"},(0,n.yg)("p",{parentName:"admonition"},"For more details on how to structure the repository and configure the deployment of each bundle see ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-content"},"GitRepo Contents"),".\nFor more details on the options that are available per Git repository see ",(0,n.yg)("a",{parentName:"p",href:"/gitrepo-add"},"Adding a GitRepo"),".")),(0,n.yg)("h2",{id:"single-cluster-examples"},"Single-Cluster Examples"),(0,n.yg)("p",null,"All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet."),(0,n.yg)(s.A,{groupId:"examples",mdxType:"Tabs"},(0,n.yg)(o.A,{value:"helm",label:"Helm",default:!0,mdxType:"TabItem"},(0,n.yg)("p",null,"An example using Helm. We are deploying the ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet-examples/tree/master/single-cluster/helm"},"helm example")," to the local cluster."),(0,n.yg)("p",null,"The repository contains a helm chart and an optional ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to configure the deployment:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="fleet.yaml"',title:'"fleet.yaml"'},'namespace: fleet-helm-example\n\n# Custom helm options\nhelm:\n # The release name to use. If empty a generated release name will be used\n releaseName: guestbook\n\n # The directory of the chart in the repo. Also any valid go-getter supported\n # URL can be used there is specify where to download the chart from.\n # If repo below is set this value if the chart name in the repo\n chart: ""\n\n # An https to a valid Helm repository to download the chart from\n repo: ""\n\n # Used if repo is set to look up the version of the chart\n version: ""\n\n # Force recreate resource that can not be updated\n force: false\n\n # How long for helm to wait for the release to be active. If the value\n # is less that or equal to zero, we will not wait in Helm\n timeoutSeconds: 0\n\n # Custom values that will be passed as values.yaml to the installation\n values:\n replicas: 2\n')),(0,n.yg)("p",null,"To create the deployment, we apply the custom resource to the upstream cluster. The ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace contains the local cluster resource. The local fleet-agent will create the deployment in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-helm-example")," namespace."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl apply -n fleet-local -f - <{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.6/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.6/index.md",sourceDirName:".",slug:"/",permalink:"/0.6/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/index.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.6/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8047],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.5/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.5/index.md",sourceDirName:".",slug:"/",permalink:"/0.5/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/index.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.5/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(3615).A,width:"969",height:"775"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users have a high degree of control, consistency, and auditability."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},3615:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/arch-1c6cd25727f6427c62add813758335a8.png"}}]); \ No newline at end of file diff --git a/assets/js/e0fa3763.83f71946.js b/assets/js/e0fa3763.83f71946.js deleted file mode 100644 index 781de562b..000000000 --- a/assets/js/e0fa3763.83f71946.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9524],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.10/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.10/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.10/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/bundle-diffs.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.10/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.10/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/e0fa3763.8cc4f5ab.js b/assets/js/e0fa3763.8cc4f5ab.js new file mode 100644 index 000000000..de2042bb5 --- /dev/null +++ b/assets/js/e0fa3763.8cc4f5ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9524],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.10/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.10/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.10/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/bundle-diffs.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.10/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.10/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/e1252df2.9822c52a.js b/assets/js/e1252df2.8157948f.js similarity index 87% rename from assets/js/e1252df2.9822c52a.js rename to assets/js/e1252df2.8157948f.js index 06535121b..13a1b7538 100644 --- a/assets/js/e1252df2.9822c52a.js +++ b/assets/js/e1252df2.8157948f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3484],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),g=o,d=u["".concat(i,".").concat(g)]||u[g]||f[g]||a;return r?n.createElement(d,c(c({ref:t},p),{},{components:r})):n.createElement(d,c({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=g;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.10 Changelogs"},c=void 0,l={unversionedId:"changelogs/index",id:"version-0.10/changelogs/index",title:"0.10 Changelogs",description:"* v0.10.0 (latest)",source:"@site/versioned_docs/version-0.10/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.10/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/changelogs/index.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"0.10 Changelogs"}},i={},s=[],p={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/0.10/changelogs/changelogs/v0.10.0"},"v0.10.0")," (latest)")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3484],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),g=o,d=u["".concat(i,".").concat(g)]||u[g]||f[g]||a;return r?n.createElement(d,c(c({ref:t},p),{},{components:r})):n.createElement(d,c({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=g;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.10 Changelogs"},c=void 0,l={unversionedId:"changelogs/index",id:"version-0.10/changelogs/index",title:"0.10 Changelogs",description:"* v0.10.0 (latest)",source:"@site/versioned_docs/version-0.10/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.10/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/changelogs/index.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"0.10 Changelogs"}},i={},s=[],p={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/0.10/changelogs/changelogs/v0.10.0"},"v0.10.0")," (latest)")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e15d65f4.c9e8e7d9.js b/assets/js/e15d65f4.c8d0415b.js similarity index 88% rename from assets/js/e15d65f4.c9e8e7d9.js rename to assets/js/e15d65f4.c8d0415b.js index f9bce77f9..d42ad4a17 100644 --- a/assets/js/e15d65f4.c9e8e7d9.js +++ b/assets/js/e15d65f4.c8d0415b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7371],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),d=o,g=u["".concat(i,".").concat(d)]||u[d]||f[d]||a;return r?n.createElement(g,c(c({ref:t},p),{},{components:r})):n.createElement(g,c({ref:t},p))}));function g(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=d;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"Next \ud83d\udea7"},c=void 0,l={unversionedId:"changelogs/index",id:"changelogs/index",title:"Next \ud83d\udea7",description:"We are still working on the next release.",source:"@site/docs/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/changelogs/index.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"Next \ud83d\udea7"}},i={},s=[],p={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"We are still working on the next release."))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7371],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>g});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),d=o,g=u["".concat(i,".").concat(d)]||u[d]||f[d]||a;return r?n.createElement(g,c(c({ref:t},p),{},{components:r})):n.createElement(g,c({ref:t},p))}));function g(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=d;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[u]="string"==typeof e?e:o,c[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"Next \ud83d\udea7"},c=void 0,l={unversionedId:"changelogs/index",id:"changelogs/index",title:"Next \ud83d\udea7",description:"We are still working on the next release.",source:"@site/docs/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/changelogs/index.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"Next \ud83d\udea7"}},i={},s=[],p={toc:s},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"We are still working on the next release."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dd67116e.c5edf10a.js b/assets/js/e252aa27.71a0ba2b.js similarity index 85% rename from assets/js/dd67116e.c5edf10a.js rename to assets/js/e252aa27.71a0ba2b.js index 180e4f0d1..e0a844521 100644 --- a/assets/js/dd67116e.c5edf10a.js +++ b/assets/js/e252aa27.71a0ba2b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5039],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),g=r,m=p["".concat(l,".").concat(g)]||p[g]||d[g]||i;return n?a.createElement(m,o(o({ref:t},u),{},{components:n})):a.createElement(m,o({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const i={},o="Cluster Registration Tokens",s={unversionedId:"cluster-tokens",id:"version-0.4/cluster-tokens",title:"Cluster Registration Tokens",description:"Not needed for Manager initiated registration:",source:"@site/versioned_docs/version-0.4/cluster-tokens.md",sourceDirName:".",slug:"/cluster-tokens",permalink:"/0.4/cluster-tokens",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-tokens.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.4/cluster-overview"},next:{title:"Agent Initiated",permalink:"/0.4/agent-initiated"}},l={},c=[{value:"Token TTL",id:"token-ttl",level:2},{value:"Create a new Token",id:"create-a-new-token",level:2},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"cluster-registration-tokens"},"Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager initiated registration"),":\nFor manager initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h2",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h2",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.4/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h2",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3636],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),g=r,m=p["".concat(l,".").concat(g)]||p[g]||d[g]||i;return n?a.createElement(m,o(o({ref:t},u),{},{components:n})):a.createElement(m,o({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const i={},o="Cluster Registration Tokens",s={unversionedId:"cluster-tokens",id:"version-0.5/cluster-tokens",title:"Cluster Registration Tokens",description:"Not needed for Manager initiated registration:",source:"@site/versioned_docs/version-0.5/cluster-tokens.md",sourceDirName:".",slug:"/cluster-tokens",permalink:"/0.5/cluster-tokens",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-tokens.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.5/cluster-overview"},next:{title:"Agent Initiated",permalink:"/0.5/agent-initiated"}},l={},c=[{value:"Token TTL",id:"token-ttl",level:2},{value:"Create a new Token",id:"create-a-new-token",level:2},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"cluster-registration-tokens"},"Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager initiated registration"),":\nFor manager initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h2",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h2",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.5/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h2",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e252aa27.ac78d18e.js b/assets/js/e252aa27.ac78d18e.js deleted file mode 100644 index 205319b93..000000000 --- a/assets/js/e252aa27.ac78d18e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3636],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),g=r,m=p["".concat(l,".").concat(g)]||p[g]||d[g]||i;return n?a.createElement(m,o(o({ref:t},u),{},{components:n})):a.createElement(m,o({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const i={},o="Cluster Registration Tokens",s={unversionedId:"cluster-tokens",id:"version-0.5/cluster-tokens",title:"Cluster Registration Tokens",description:"Not needed for Manager initiated registration:",source:"@site/versioned_docs/version-0.5/cluster-tokens.md",sourceDirName:".",slug:"/cluster-tokens",permalink:"/0.5/cluster-tokens",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/cluster-tokens.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.5/cluster-overview"},next:{title:"Agent Initiated",permalink:"/0.5/agent-initiated"}},l={},c=[{value:"Token TTL",id:"token-ttl",level:2},{value:"Create a new Token",id:"create-a-new-token",level:2},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"cluster-registration-tokens"},"Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager initiated registration"),":\nFor manager initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent initiated registration the downstream cluster must have a cluster registration token.\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h2",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h2",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.5/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h2",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e30200fb.87f83b5e.js b/assets/js/e30200fb.87f83b5e.js deleted file mode 100644 index 6e2f7574e..000000000 --- a/assets/js/e30200fb.87f83b5e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7845],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},8137:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.10/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.10/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.10/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cluster-registration.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.10/installation"},next:{title:"Create Cluster Groups",permalink:"/0.10/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.10/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/0.10/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.10/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e30200fb.9eebf0ae.js b/assets/js/e30200fb.9eebf0ae.js new file mode 100644 index 000000000..559d2db6a --- /dev/null +++ b/assets/js/e30200fb.9eebf0ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7845],{9365:(e,t,n)=>{n.d(t,{A:()=>i});var a=n(6540),r=n(53);const l={tabItem:"tabItem_Ymn6"};function i(e){let{children:t,hidden:n,className:i}=e;return a.createElement("div",{role:"tabpanel",className:(0,r.A)(l.tabItem,i),hidden:n},t)}},1470:(e,t,n)=>{n.d(t,{A:()=>N});var a=n(8168),r=n(6540),l=n(53),i=n(3104),s=n(6347),o=n(7485),u=n(1682),c=n(9466);function g(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:n,attributes:a,default:r}}=e;return{value:t,label:n,attributes:a,default:r}}))}function d(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??g(n);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function p(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:n}=e;const a=(0,s.W6)(),l=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(l),(0,r.useCallback)((e=>{if(!l)return;const t=new URLSearchParams(a.location.search);t.set(l,e),a.replace({...a.location,search:t.toString()})}),[l,a])]}function h(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,l=d(e),[i,s]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const a=n.find((e=>e.default))??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:t,tabValues:l}))),[o,u]=m({queryString:n,groupId:a}),[g,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,l]=(0,c.Dv)(n);return[a,(0,r.useCallback)((e=>{n&&l.set(e)}),[n,l])]}({groupId:a}),y=(()=>{const e=o??g;return p({value:e,tabValues:l})?e:null})();(0,r.useLayoutEffect)((()=>{y&&s(y)}),[y]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),h(e)}),[u,h,l]),tabValues:l}}var y=n(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:n,selectedValue:s,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:g}=(0,i.a_)(),d=e=>{const t=e.currentTarget,n=c.indexOf(t),a=u[n].value;a!==s&&(g(t),o(a))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;t=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;t=c[n]??c[c.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},t)},u.map((e=>{let{value:t,label:n,attributes:i}=e;return r.createElement("li",(0,a.A)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>c.push(e),onKeyDown:p,onClick:d},i,{className:(0,l.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===t})}),n??t)})))}function v(e){let{lazy:t,children:n,selectedValue:a}=e;const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=l.find((e=>e.props.value===a));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},l.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==a}))))}function w(e){const t=h(e);return r.createElement("div",{className:(0,l.A)("tabs-container",f.tabList)},r.createElement(b,(0,a.A)({},e,t)),r.createElement(v,(0,a.A)({},e,t)))}function N(e){const t=(0,y.A)();return r.createElement(w,(0,a.A)({key:String(t)},e))}},7858:(e,t,n)=>{n.d(t,{e:()=>a});const a={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},8137:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>u,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(8168),r=(n(6540),n(5680)),l=(n(7858),n(2355)),i=n(1470),s=n(9365);const o={},u="Register Downstream Clusters",c={unversionedId:"cluster-registration",id:"version-0.10/cluster-registration",title:"Register Downstream Clusters",description:"Overview",source:"@site/versioned_docs/version-0.10/cluster-registration.md",sourceDirName:".",slug:"/cluster-registration",permalink:"/0.10/cluster-registration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cluster-registration.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation Details",permalink:"/0.10/installation"},next:{title:"Create Cluster Groups",permalink:"/0.10/cluster-group"}},g={},d=[{value:"Overview",id:"overview",level:2},{value:"Agent-Initiated Registration",id:"agent-initiated-registration",level:3},{value:"Manager-Initiated Registration",id:"manager-initiated-registration",level:3},{value:"Agent Initiated",id:"agent-initiated",level:2},{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:3},{value:"Install Agent For a New Cluster",id:"install-agent-for-a-new-cluster",level:3},{value:"Install Agent For a Predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:3},{value:"Create Cluster Registration Tokens",id:"create-cluster-registration-tokens",level:3},{value:"Token TTL",id:"token-ttl",level:4},{value:"Create a new Token",id:"create-a-new-token",level:4},{value:"Obtaining Token Value (Agent values.yaml)",id:"obtaining-token-value-agent-valuesyaml",level:4},{value:"Manager Initiated",id:"manager-initiated",level:2},{value:"Create Kubeconfig Secret",id:"create-kubeconfig-secret",level:3},{value:"Create Cluster Resource",id:"create-cluster-resource",level:3}],p={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"register-downstream-clusters"},"Register Downstream Clusters"),(0,r.yg)("h2",{id:"overview"},"Overview"),(0,r.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,r.yg)("strong",{parentName:"p"},"agent-initiated")," and ",(0,r.yg)("strong",{parentName:"p"},"manager-initiated")," registration. Typically one would\ngo with the agent-initiated registration but there are specific use cases in which\nmanager-initiated is a better workflow."),(0,r.yg)("h3",{id:"agent-initiated-registration"},"Agent-Initiated Registration"),(0,r.yg)("p",null,"Agent-initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,r.yg)("h3",{id:"manager-initiated-registration"},"Manager-Initiated Registration"),(0,r.yg)("p",null,"Manager-initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."),(0,r.yg)("h2",{id:"agent-initiated"},"Agent Initiated"),(0,r.yg)("p",null,"A downstream cluster is registered by installing an agent via helm and using the ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,r.yg)("strong",{parentName:"p"},"client ID")," or ",(0,r.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"It's not necessary to configure the fleet manager for ",(0,r.yg)("a",{parentName:"p",href:"/0.10/installation#configuration-for-multi-cluster"},"multi cluster"),", as the downstream agent we install via Helm will connect to the Kubernetes API of the upstream cluster directly."),(0,r.yg)("p",{parentName:"admonition"},"Agent-initiated registration is normally not used with Rancher.")),(0,r.yg)("h3",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required.\nThe ",(0,r.yg)("a",{parentName:"p",href:"/0.10/architecture#security"},"cluster registration token")," is manifested as a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will be passed to the ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install")," process.\nAlternatively one can pass the token directly to the helm install command via ",(0,r.yg)("inlineCode",{parentName:"p"},'--set token="$token"'),"."),(0,r.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,r.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,r.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,r.yg)("h3",{id:"install-agent-for-a-new-cluster"},"Install Agent For a New Cluster"),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,r.yg)("p",null,"First, follow the ",(0,r.yg)("a",{parentName:"p",href:"#create-cluster-registration-tokens"},"cluster registration token instructions")," to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,r.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,r.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,r.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,r.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,r.yg)("p",null,"Value in ",(0,r.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,r.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,r.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,r.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,r.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{title:"Kubectl Context",type:"warning"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"install-agent-for-a-predefined-cluster"},"Install Agent For a Predefined Cluster"),(0,r.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,r.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,r.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,r.yg)("p",null,"First, create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,r.yg)("p",null,"Second, follow the ","[cluster registration token instructions]","((#create-cluster-registration-tokens) to obtain the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,r.yg)("p",null,"Third, setup your environment to use the client ID."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,r.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,r.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,r.yg)("p",null,"Add Fleet's Helm repo."),(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,r.yg)("p",null,"Finally, install the agent using Helm."),(0,r.yg)(i.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"helm2",label:"Install",default:!0,mdxType:"TabItem"},(0,r.yg)(l.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent fleet/fleet-agent')),(0,r.yg)(s.A,{value:"validate2",label:"Validate",mdxType:"TabItem"},"You can check that status of the fleet pods by running the below commands.",(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")))),"The agent should now be deployed.",(0,r.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,r.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,r.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespace"),". Please ensure your ",(0,r.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z\n")),(0,r.yg)("h3",{id:"create-cluster-registration-tokens"},"Create Cluster Registration Tokens"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("strong",{parentName:"p"},"Not needed for Manager-initiated registration"),":\nFor manager-initiated registrations the token is managed by the Fleet manager and does\nnot need to be manually created and obtained.")),(0,r.yg)("p",null,"For an agent-initiated registration the downstream cluster must have a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/architecture#security"},"cluster registration token"),".\nCluster registration tokens are used to establish a new identity for a cluster. Internally\ncluster registration tokens are managed by creating Kubernetes service accounts that have the\npermissions to create ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationRequests")," within a specific namespace. Once the\ncluster is registered a new ",(0,r.yg)("inlineCode",{parentName:"p"},"ServiceAccount")," is created for that cluster that is used as\nthe unique identity of the cluster. The agent is designed to forget the cluster registration\ntoken after registration. While the agent will not maintain a reference to the cluster registration\ntoken after a successful registration please note that usually other system bootstrap scripts do."),(0,r.yg)("p",null,"Since the cluster registration token is forgotten, if you need to re-register a cluster you must\ngive the cluster a new registration token."),(0,r.yg)("h4",{id:"token-ttl"},"Token TTL"),(0,r.yg)("p",null,"Cluster registration tokens can be reused by any cluster in a namespace. The tokens can be given a TTL\nsuch that it will expire after a specific time."),(0,r.yg)("h4",{id:"create-a-new-token"},"Create a new Token"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistationToken")," is a namespaced type and should be created in the same namespace\nin which you will create ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resources. For in depth details on how namespaces\nare used in Fleet refer to the documentation on ",(0,r.yg)("a",{parentName:"p",href:"/0.10/namespaces"},"namespaces"),". Create a new\ntoken with the below YAML."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: ClusterRegistrationToken\napiVersion: "fleet.cattle.io/v1alpha1"\nmetadata:\n name: new-token\n namespace: clusters\nspec:\n # A duration string for how long this token is valid for. A value <= 0 or null means infinite time.\n ttl: 240h\n')),(0,r.yg)("p",null,"After the ",(0,r.yg)("inlineCode",{parentName:"p"},"ClusterRegistrationToken")," is created, Fleet will create a corresponding ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," with the same name.\nAs the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," creation is performed asynchronously, you will need to wait until it's available before using it."),(0,r.yg)("p",null,"One way to do so is via the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"while ! kubectl --namespace=clusters get secret new-token; do sleep 5; done\n")),(0,r.yg)("h4",{id:"obtaining-token-value-agent-valuesyaml"},"Obtaining Token Value (Agent values.yaml)"),(0,r.yg)("p",null,"The token value contains YAML content for a ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that is expected to be passed to ",(0,r.yg)("inlineCode",{parentName:"p"},"helm install"),"\nto install the Fleet agent on a downstream cluster."),(0,r.yg)("p",null,"Such value is contained in the ",(0,r.yg)("inlineCode",{parentName:"p"},"values")," field of the ",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," mentioned above. To obtain the YAML content for the\nabove example one can run the following one-liner:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl --namespace clusters get secret new-token -o 'jsonpath={.data.values}' | base64 --decode > values.yaml\n")),(0,r.yg)("p",null,"Once the ",(0,r.yg)("inlineCode",{parentName:"p"},"values.yaml")," is ready it can be used repeatedly by clusters to register until the TTL expires."),(0,r.yg)("h2",{id:"manager-initiated"},"Manager Initiated"),(0,r.yg)("p",null,"The manager-initiated registration flow is accomplished by creating a\n",(0,r.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet Manager that refers to a Kubernetes\n",(0,r.yg)("inlineCode",{parentName:"p"},"Secret")," containing a valid kubeconfig file in the data field called ",(0,r.yg)("inlineCode",{parentName:"p"},"value"),"."),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"If you are using Fleet standalone ",(0,r.yg)("em",{parentName:"p"},"without Rancher"),", it must be installed as described in ",(0,r.yg)("a",{parentName:"p",href:"/0.10/installation#configuration-for-multi-cluster"},"installation details"),"."),(0,r.yg)("p",{parentName:"admonition"},"The manager-initiated registration is used when you add a cluster from the Rancher dashboard.")),(0,r.yg)("h3",{id:"create-kubeconfig-secret"},"Create Kubeconfig Secret"),(0,r.yg)("p",null,"The format of this secret is intended to match the ",(0,r.yg)("a",{parentName:"p",href:"https://cluster-api.sigs.k8s.io/developer/architecture/controllers/cluster.html#secrets"},"format")," of the kubeconfig\nsecret used in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),".\nThis means you can use ",(0,r.yg)("inlineCode",{parentName:"p"},"cluster-api")," to create a cluster that is dynamically registered with Fleet."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Kubeconfig Secret Example"',title:'"Kubeconfig',Secret:!0,'Example"':!0},"kind: Secret\napiVersion: v1\nmetadata:\n name: my-cluster-kubeconfig\n namespace: clusters\ndata:\n value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==\n")),(0,r.yg)("h3",{id:"create-cluster-resource"},"Create Cluster Resource"),(0,r.yg)("p",null,"The cluster resource needs to reference the kubeconfig secret."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="Cluster Resource Example"',title:'"Cluster',Resource:!0,'Example"':!0},'apiVersion: fleet.cattle.io/v1alpha1\nkind: Cluster\nmetadata:\n name: my-cluster\n namespace: clusters\n labels:\n demo: "true"\n env: dev\nspec:\n kubeConfigSecret: my-cluster-kubeconfig\n')))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e3313a7e.40608f99.js b/assets/js/e3313a7e.40608f99.js new file mode 100644 index 000000000..ff735a3a8 --- /dev/null +++ b/assets/js/e3313a7e.40608f99.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9679],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>u});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(a),h=n,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return a?r.createElement(u,o(o({ref:t},p),{},{components:a})):r.createElement(u,o({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.8.5",date:"2024-06-05 07:35:17 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.5",id:"version-0.8/changelogs/changelogs/v0.8.5",title:"v0.8.5",description:"(rancherio-gh-m) released this 2024-06-05 0717 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.5.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.5",permalink:"/0.8/changelogs/changelogs/v0.8.5",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.5.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.8.5",date:"2024-06-05 07:35:17 +0000 UTC"},sidebar:"docs",previous:{title:"",permalink:"/0.8/changelogs/changelogs/v0.8.4"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},d="wrapper";function g(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-06-05 07:35:17 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"[0.8] Bump gitjob version to v0.8.8 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330484112","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2480","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2480/hovercard",href:"https://github.com/rancher/fleet/pull/2480"},"#2480")),(0,n.yg)("li",null,"[0.8] bump docker to 23.0.11 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330489265","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2481","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2481/hovercard",href:"https://github.com/rancher/fleet/pull/2481"},"#2481"))),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.4...v0.8.5"},(0,n.yg)("tt",null,"v0.8.4...v0.8.5"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-crd-0.8.5.tgz"},"fleet-crd-0.8.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-agent-0.8.5.tgz"},"fleet-agent-0.8.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-0.8.5.tgz"},"fleet-0.8.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.5"},"here"))))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e3313a7e.51086e7f.js b/assets/js/e3313a7e.51086e7f.js deleted file mode 100644 index 12f97ff18..000000000 --- a/assets/js/e3313a7e.51086e7f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9679],{5680:(e,t,a)=>{a.d(t,{xA:()=>p,yg:()=>u});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(a),h=n,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return a?r.createElement(u,o(o({ref:t},p),{},{components:a})):r.createElement(u,o({ref:t},p))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:n,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=a(8168),n=(a(6540),a(5680));const l={title:"v0.8.5",date:"2024-06-05 07:35:17 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.5",id:"version-0.8/changelogs/changelogs/v0.8.5",title:"v0.8.5",description:"(rancherio-gh-m) released this 2024-06-05 0717 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.5.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.5",permalink:"/0.8/changelogs/changelogs/v0.8.5",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.5.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.8.5",date:"2024-06-05 07:35:17 +0000 UTC"},sidebar:"docs",previous:{title:"",permalink:"/0.8/changelogs/changelogs/v0.8.4"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],p={toc:c},d="wrapper";function g(e){let{components:t,...a}=e;return(0,n.yg)(d,(0,r.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-06-05 07:35:17 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"What's Changed"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"[0.8] Bump gitjob version to v0.8.8 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330484112","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2480","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2480/hovercard",href:"https://github.com/rancher/fleet/pull/2480"},"#2480")),(0,n.yg)("li",null,"[0.8] bump docker to 23.0.11 by ",(0,n.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2330489265","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2481","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2481/hovercard",href:"https://github.com/rancher/fleet/pull/2481"},"#2481"))),(0,n.yg)("p",null,(0,n.yg)("strong",null,"Full Changelog"),": ",(0,n.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.4...v0.8.5"},(0,n.yg)("tt",null,"v0.8.4...v0.8.5"))),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-crd-0.8.5.tgz"},"fleet-crd-0.8.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-agent-0.8.5.tgz"},"fleet-agent-0.8.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-0.8.5.tgz"},"fleet-0.8.5.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.5/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.5"},"here"))))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e348fb9e.27397eca.js b/assets/js/e348fb9e.27397eca.js deleted file mode 100644 index 7bc8247bd..000000000 --- a/assets/js/e348fb9e.27397eca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8861],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.7/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.7/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.7/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/troubleshooting.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.7/ref-bundle"},next:{title:"v0.7.0",permalink:"/0.7/changelogs/changelogs/v0.7.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,a.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.7/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e348fb9e.e7a6b598.js b/assets/js/e348fb9e.e7a6b598.js new file mode 100644 index 000000000..37ed62e00 --- /dev/null +++ b/assets/js/e348fb9e.e7a6b598.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8861],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),h=a,u=d["".concat(s,".").concat(h)]||d[h]||g[h]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=h;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>g,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.7/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.7/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.7/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/troubleshooting.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Bundle Resource",permalink:"/0.7/ref-bundle"},next:{title:"v0.7.0",permalink:"/0.7/changelogs/changelogs/v0.7.0"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Fetch detailed status from GitRepos and Bundles?",id:"fetch-detailed-status-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Agent is no longer registered",id:"agent-is-no-longer-registered",level:3},{value:"Nested GitRepo CRs",id:"nested-gitrepo-crs",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function g(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled."),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"fetch-detailed-status-from-gitrepos-and-bundles"},"Fetch detailed status from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"For debugging and bug reports the raw JSON of the resources status fields is most useful.\nThis can be accessed in the Rancher UI, or through ",(0,a.yg)("inlineCode",{parentName:"p"},"kubectl"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}\nkubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}\n")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo."),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu"),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown"),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.7/ref-fleet-yaml"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority"\n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm:\n releaseName: \n repo: \n chart: \ndiff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations"\n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.7/bundle-diffs"},"bundle diffs documentation")," for more information.")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"agent-is-no-longer-registered"},"Agent is no longer registered"),(0,a.yg)("p",null,"You can force a redeployment of an agent for a given cluster by setting ",(0,a.yg)("inlineCode",{parentName:"p"},"redeployAgentGeneration"),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},'kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p \'[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]\'\n')),(0,a.yg)("h3",{id:"nested-gitrepo-crs"},"Nested GitRepo CRs"),(0,a.yg)("p",null,"Managing Fleet within Fleet (nested ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," usage) is not currently supported. We will update the documentation if support becomes available."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e35f16a8.780a0a97.js b/assets/js/e35f16a8.aa3288ae.js similarity index 71% rename from assets/js/e35f16a8.780a0a97.js rename to assets/js/e35f16a8.aa3288ae.js index 06c98c7dc..a7c0cb57b 100644 --- a/assets/js/e35f16a8.780a0a97.js +++ b/assets/js/e35f16a8.aa3288ae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8384],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.7/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.7/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.7/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.7/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.7/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable agent on local cluster\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8384],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>g});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),p=s(r),d=l,g=p["".concat(c,".").concat(d)]||p[d]||u[d]||a;return r?n.createElement(g,o(o({ref:t},f),{},{components:r})):n.createElement(g,o({ref:t},f))}));function g(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=r.length,o=new Array(a);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet-manager"},o=void 0,i={unversionedId:"cli/fleet-controller/fleet-manager",id:"version-0.7/cli/fleet-controller/fleet-manager",title:"",description:"fleet-manager",source:"@site/versioned_docs/version-0.7/cli/fleet-controller/fleet-manager.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleet-manager",permalink:"/0.7/cli/fleet-controller/fleet-manager",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/cli/fleet-controller/fleet-manager.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet-manager"},sidebar:"docs",previous:{title:"fleet test",permalink:"/0.7/cli/fleet-cli/fleet_test"},next:{title:"Cluster and Bundle State",permalink:"/0.7/cluster-bundles-state"}},c={},s=[{value:"fleet-manager",id:"fleet-manager",level:2},{value:"Options",id:"options",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-manager"},"fleet-manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet-manager [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n --disable-bootstrap disable agent on local cluster\n --disable-gitops disable gitops components\n -h, --help help for fleet-manager\n --kubeconfig string Kubeconfig file\n --namespace string namespace to watch (default "cattle-fleet-system")\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e3aa6547.d3e047a0.js b/assets/js/e3aa6547.d3e047a0.js deleted file mode 100644 index 02ab80411..000000000 --- a/assets/js/e3aa6547.d3e047a0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4697],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Image scan",s={unversionedId:"imagescan",id:"version-0.4/imagescan",title:"Image scan",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.4/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.4/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/imagescan.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Webhook",permalink:"/0.4/webhook"},next:{title:"Cluster and Bundle state",permalink:"/0.4/cluster-bundles-state"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"image-scan"},"Image scan"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order \n- policy: \n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver: \n range: "*" \n # can use ascending or descending order\n alphabetical:\n order: asc \n\n # specify images to scan\n image: "your.registry.com/repo/image" \n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret \n\n # Specify the scan interval\n interval: 5m \n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples \n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m \n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret \n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e3aa6547.f95e465e.js b/assets/js/e3aa6547.f95e465e.js new file mode 100644 index 000000000..70b3bdb8c --- /dev/null +++ b/assets/js/e3aa6547.f95e465e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4697],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Image scan",s={unversionedId:"imagescan",id:"version-0.4/imagescan",title:"Image scan",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.4/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.4/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/imagescan.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Webhook",permalink:"/0.4/webhook"},next:{title:"Cluster and Bundle state",permalink:"/0.4/cluster-bundles-state"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"image-scan"},"Image scan"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order \n- policy: \n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver: \n range: "*" \n # can use ascending or descending order\n alphabetical:\n order: asc \n\n # specify images to scan\n image: "your.registry.com/repo/image" \n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret \n\n # Specify the scan interval\n interval: 5m \n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples \n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m \n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret \n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e431d4ee.5976e20f.js b/assets/js/e431d4ee.5976e20f.js new file mode 100644 index 000000000..259bff688 --- /dev/null +++ b/assets/js/e431d4ee.5976e20f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2942],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5733:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.7/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.7/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.7/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/installation.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources",permalink:"/0.7/ref-resources"},next:{title:"Register Downstream Clusters",permalink:"/0.7/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"First add Fleet's Helm repository."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA.")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.7/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.7/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.7/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/e431d4ee.bbecd114.js b/assets/js/e431d4ee.bbecd114.js deleted file mode 100644 index c2f4dc2ac..000000000 --- a/assets/js/e431d4ee.bbecd114.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2942],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>w});var n=a(8168),l=a(6540),r=a(53),s=a(3104),i=a(6347),o=a(7485),u=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,o.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function h(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[o,u]=g({queryString:a,groupId:n}),[d,h]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),f=(()=>{const e=o??d;return m({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{f&&i(f)}),[f]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),h(e)}),[u,h,r]),tabValues:r}}var f=a(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function b(e){let{className:t,block:a,selectedValue:i,selectValue:o,tabValues:u}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=u[a].value;n!==i&&(d(t),o(n))},m=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>c.push(e),onKeyDown:m,onClick:p},s,{className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":i===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function A(e){const t=h(e);return l.createElement("div",{className:(0,r.A)("tabs-container",y.tabList)},l.createElement(b,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function w(e){const t=(0,f.A)();return l.createElement(A,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5733:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var n=a(8168),l=(a(6540),a(5680)),r=a(7858),s=a(2355),i=a(1470),o=a(9365);const u={},c="Installation Details",d={unversionedId:"installation",id:"version-0.7/installation",title:"Installation Details",description:"The installation is broken up into two different use cases: single and multi-cluster.",source:"@site/versioned_docs/version-0.7/installation.md",sourceDirName:".",slug:"/installation",permalink:"/0.7/installation",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/installation.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Custom Resources",permalink:"/0.7/ref-resources"},next:{title:"Register Downstream Clusters",permalink:"/0.7/cluster-registration"}},p={},m=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Default Install",id:"default-install",level:2},{value:"Configuration for Multi-Cluster",id:"configuration-for-multi-cluster",level:2},{value:"API Server URL and CA certificate",id:"api-server-url-and-ca-certificate",level:3},{value:"Extract CA certificate",id:"extract-ca-certificate",level:4},{value:"Extract API Server",id:"extract-api-server",level:4},{value:"Validate",id:"validate",level:4},{value:"Install for Multi-Cluster",id:"install-for-multi-cluster",level:3}],g={toc:m},h="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(h,(0,n.A)({},g,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"installation-details"},"Installation Details"),(0,l.yg)("p",null,"The installation is broken up into two different use cases: single and multi-cluster.\nThe single cluster install is for if you wish to use GitOps to manage a single cluster,\nin which case you do not need a centralized manager cluster. In the multi-cluster use case\nyou will setup a centralized manager cluster to which you can register clusters."),(0,l.yg)("p",null,"If you are just learning Fleet the single cluster install is the recommended starting\npoint. After which you can move from single cluster to multi-cluster setup down the line."),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Single-cluster is the default installation. The same cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,l.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"helm",label:"Helm 3",default:!0,mdxType:"TabItem"},"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is fairly straight forward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)(o.A,{value:"kubernetes",label:"Kubernetes",default:!0,mdxType:"TabItem"},"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the single cluster use case you will install Fleet to the cluster which you intend to manage with GitOps. Any Kubernetes community supported version of Kubernetes will work, in practice this means ",r.e.next.kubernetes," or greater.")),(0,l.yg)("h2",{id:"default-install"},"Default Install"),(0,l.yg)("p",null,"Install the following two Helm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install",label:"Install",default:!0,mdxType:"TabItem"},(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)("p",null,"First add Fleet's Helm repository."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd"),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet")),(0,l.yg)(o.A,{value:"verify",label:"Verify",mdxType:"TabItem"},(0,l.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add"},"register some git repos")," in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."),(0,l.yg)("h2",{id:"configuration-for-multi-cluster"},"Configuration for Multi-Cluster"),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Downstream clusters in Rancher are automatically registered in Fleet. Users can access Fleet under ",(0,l.yg)("inlineCode",{parentName:"p"},"Continuous Delivery")," on Rancher."),(0,l.yg)("p",{parentName:"admonition"},"The multi-cluster install described below is ",(0,l.yg)("strong",{parentName:"p"},"only")," covered in standalone Fleet, which is untested by Rancher QA.")),(0,l.yg)("admonition",{type:"info"},(0,l.yg)("p",{parentName:"admonition"},"The setup is the same as for a single cluster.\nAfter installing the Fleet manager, you will then need to register remote downstream clusters with the Fleet manager."),(0,l.yg)("p",{parentName:"admonition"},"However, to allow for ",(0,l.yg)("a",{parentName:"p",href:"/0.7/cluster-registration#manager-initiated"},"manager-initiated registration")," of downstream clusters, a few extra settings are required. Without the API server URL and the CA, only ",(0,l.yg)("a",{parentName:"p",href:"/0.7/cluster-registration#agent-initiated"},"agent-initiated registration")," of downstream clusters is possible.")),(0,l.yg)("h3",{id:"api-server-url-and-ca-certificate"},"API Server URL and CA certificate"),(0,l.yg)("p",null,"In order for your Fleet management installation to properly work it is important\nthe correct API server URL and CA certificates are configured properly. The Fleet agents\nwill communicate to the Kubernetes API server URL. This means the Kubernetes\nAPI server must be accessible to the downstream clusters. You will also need\nto obtain the CA certificate of the API server. The easiest way to obtain this information\nis typically from your kubeconfig file (",(0,l.yg)("inlineCode",{parentName:"p"},"$HOME/.kube/config"),"). The ",(0,l.yg)("inlineCode",{parentName:"p"},"server"),",\n",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data"),", or ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority")," fields will have these values."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="$HOME/.kube/config"',title:'"$HOME/.kube/config"'},"apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTi...\n server: https://example.com:6443\n")),(0,l.yg)("h4",{id:"extract-ca-certificate"},"Extract CA certificate"),(0,l.yg)("p",null,"Please note that the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," field is base64 encoded and will need to be\ndecoded before you save it into a file. This can be done by saving the base64 encoded contents to\na file and then running"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"base64 -d encoded-file > ca.pem\n")),(0,l.yg)("p",null,"Next, retrieve the CA certificate from your kubeconfig."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"extractca",label:"Extract First",mdxType:"TabItem"},"If you have `jq` and `base64` available then this one-liners will pull all CA certificates from your `KUBECONFIG` and place then in a file named `ca.pem`.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl config view -o json --raw | jq -r '.clusters[].cluster[\"certificate-authority-data\"]' | base64 -d > ca.pem\n"))),(0,l.yg)(o.A,{value:"extractcas",label:"Multiple Entries",mdxType:"TabItem"},"Or, if you have a multi-cluster setup, you can use this command:",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nkubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTERNAME").cluster["certificate-authority-data"]\' | base64 -d > ca.pem\n')))),(0,l.yg)("h4",{id:"extract-api-server"},"Extract API Server"),(0,l.yg)("p",null,"If you have a multi-cluster setup, you can use this command:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# replace CLUSTERNAME with the name of the cluster according to your KUBECONFIG\nAPI_SERVER_URL=$(kubectl config view -o json --raw | jq -r \'.clusters[] | select(.name=="CLUSTER").cluster["server"]\')\n# Leave empty if your API server is signed by a well known CA\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("h4",{id:"validate"},"Validate"),(0,l.yg)("p",null,"First validate the server URL is correct."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fLk "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"The output of this command should be JSON with the version of the Kubernetes server or a ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," error.\nIf you do not get either of these results than please ensure you have the correct URL. The API server port is typically\n6443 for Kubernetes."),(0,l.yg)("p",null,"Next validate that the CA certificate is proper by running the below command. If your API server is signed by a\nwell known CA then omit the ",(0,l.yg)("inlineCode",{parentName:"p"},'--cacert "$API_SERVER_CA"')," part of the command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'curl -fL --cacert "$API_SERVER_CA" "$API_SERVER_URL/version"\n')),(0,l.yg)("p",null,"If you get a valid JSON response or an ",(0,l.yg)("inlineCode",{parentName:"p"},"401 Unauthorized")," then it worked. The Unauthorized error is\nonly because the curl command is not setting proper credentials, but this validates that the TLS\nconnection work and the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is correct for this URL. If you get a ",(0,l.yg)("inlineCode",{parentName:"p"},"SSL certificate problem")," then\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," is not correct. The contents of the ",(0,l.yg)("inlineCode",{parentName:"p"},"$API_SERVER_CA")," file should look similar to the below:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-pem",metastring:'title="ca.pem"',title:'"ca.pem"'},"-----BEGIN CERTIFICATE-----\nMIIBVjCB/qADAgECAgEAMAoGCCqGSM49BAMCMCMxITAfBgNVBAMMGGszcy1zZXJ2\nZXItY2FAMTU5ODM5MDQ0NzAeFw0yMDA4MjUyMTIwNDdaFw0zMDA4MjMyMTIwNDda\nMCMxITAfBgNVBAMMGGszcy1zZXJ2ZXItY2FAMTU5ODM5MDQ0NzBZMBMGByqGSM49\nAgEGCCqGSM49AwEHA0IABDXlQNkXnwUPdbSgGz5Rk6U9ldGFjF6y1YyF36cNGk4E\n0lMgNcVVD9gKuUSXEJk8tzHz3ra/+yTwSL5xQeLHBl+jIzAhMA4GA1UdDwEB/wQE\nAwICpDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFMtZ5gGDoDs\nciRyve+T4xbRNVHES39tjjup/LuN4tAgAiAteeB3jgpTMpZyZcOOHl9gpZ8PgEcN\nKDs/pb3fnMTtpA==\n-----END CERTIFICATE-----\n")),(0,l.yg)("h3",{id:"install-for-multi-cluster"},"Install for Multi-Cluster"),(0,l.yg)("p",null,"In the following example it will be assumed the API server URL from the ",(0,l.yg)("inlineCode",{parentName:"p"},"KUBECONFIG")," which is ",(0,l.yg)("inlineCode",{parentName:"p"},"https://example.com:6443"),"\nand the CA certificate is in the file ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem"),". If your API server URL is signed by a well-known CA you can\nomit the ",(0,l.yg)("inlineCode",{parentName:"p"},"apiServerCA")," parameter below or just create an empty ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.pem")," file (ie ",(0,l.yg)("inlineCode",{parentName:"p"},"touch ca.pem"),")."),(0,l.yg)("p",null,"Setup the environment with your specific values, e.g.:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'API_SERVER_URL="https://example.com:6443"\nAPI_SERVER_CA="ca.pem"\n')),(0,l.yg)("p",null,"Once you have validated the API server URL and API server CA parameters, install the following two\nHelm charts."),(0,l.yg)(i.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"install2",label:"Install",default:!0,mdxType:"TabItem"},"First add Fleet's Helm repository.",(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm repo add fleet https://rancher.github.io/fleet-helm-charts/"),(0,l.yg)("p",null,"Second install the Fleet CustomResourcesDefintions."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",r.e.next.fleetCRD),(0,l.yg)("p",null,"Third install the Fleet controllers."),(0,l.yg)(s.A,{language:"bash",mdxType:"CodeBlock"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set apiServerURL="$API_SERVER_URL" \\\n --set-file apiServerCA="$API_SERVER_CA" \\\n fleet'," ",r.e.next.fleet)),(0,l.yg)(o.A,{value:"verifiy2",label:"Verify",mdxType:"TabItem"},"Fleet should be ready to use. You can check the status of the Fleet controller pods by running the below commands.",(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")))),(0,l.yg)("p",null,"At this point the Fleet manager should be ready. You can now ",(0,l.yg)("a",{parentName:"p",href:"/0.7/cluster-registration"},"register clusters")," and ",(0,l.yg)("a",{parentName:"p",href:"/0.7/gitrepo-add#create-gitrepo-instance"},"git repos")," with\nthe Fleet manager."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/e483f3c9.4067bbda.js b/assets/js/e483f3c9.4067bbda.js new file mode 100644 index 000000000..a3ba39518 --- /dev/null +++ b/assets/js/e483f3c9.4067bbda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4726],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.9/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.9/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.9/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/concepts.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.9/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.9/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.9/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.9/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.9/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e483f3c9.cb334c3a.js b/assets/js/e483f3c9.cb334c3a.js deleted file mode 100644 index 6850ba213..000000000 --- a/assets/js/e483f3c9.cb334c3a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4726],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(n),g=a,y=u["".concat(i,".").concat(g)]||u[g]||m[g]||l;return n?r.createElement(y,o(o({ref:t},p),{},{components:n})):r.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const l={},o="Core Concepts",s={unversionedId:"concepts",id:"version-0.9/concepts",title:"Core Concepts",description:"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers",source:"@site/versioned_docs/version-0.9/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/0.9/concepts",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/concepts.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Architecture",permalink:"/0.9/architecture"},next:{title:"Bundle Lifecycle",permalink:"/0.9/ref-bundle-stages"}},i={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"core-concepts"},"Core Concepts"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers\nto manage GitOps for a single Kubernetes cluster or a large-scale deployment of Kubernetes clusters."),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},"For more on the naming conventions of CRDs, click ",(0,a.yg)("a",{parentName:"p",href:"/0.9/troubleshooting#naming-conventions-for-crds"},"here"),".")),(0,a.yg)("p",null,"Below are some of the concepts of Fleet that will be useful throughout this documentation:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet Manager"),": The centralized component that orchestrates the deployments of Kubernetes assets\nfrom git. In a multi-cluster setup, this will typically be a dedicated Kubernetes cluster. In a\nsingle cluster setup, the Fleet manager will be running on the same cluster you are managing with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet controller"),": The controller(s) running on the Fleet manager orchestrating GitOps. In practice,\nthe Fleet manager and Fleet controllers are used fairly interchangeably."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Single Cluster Style"),": This is a style of installing Fleet in which the manager and downstream cluster are the\nsame cluster. This is a very simple pattern to quickly get up and running with GitOps."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Multi Cluster Style"),": This is a style of running Fleet in which you have a central manager that manages a large\nnumber of downstream clusters."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Fleet agent"),": Every managed downstream cluster will run an agent that communicates back to the Fleet manager.\nThis agent is just another set of Kubernetes controllers running in the downstream cluster."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"GitRepo"),": Git repositories that are watched by Fleet are represented by the type ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),".")),(0,a.yg)("blockquote",null,(0,a.yg)("p",{parentName:"blockquote"},(0,a.yg)("strong",{parentName:"p"},"Example installation order via ",(0,a.yg)("inlineCode",{parentName:"strong"},"GitRepo")," custom resources when using Fleet for the configuration management of downstream clusters:")),(0,a.yg)("ol",{parentName:"blockquote"},(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/projectcalico/calico"},"Calico")," CRDs and controllers."),(0,a.yg)("li",{parentName:"ol"},"Set one or multiple cluster-level global network policies."),(0,a.yg)("li",{parentName:"ol"},"Install ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/open-policy-agent/gatekeeper"},"GateKeeper"),". Note that ",(0,a.yg)("strong",{parentName:"li"},"cluster labels")," and ",(0,a.yg)("strong",{parentName:"li"},"overlays")," are critical features in Fleet as they determine which clusters will get each part of the bundle."),(0,a.yg)("li",{parentName:"ol"},"Set up and configure ingress and system daemons."))),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Bundle"),": An internal unit used for the orchestration of resources from git.\nWhen a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is scanned it will produce one or more bundles. Bundles are a collection of\nresources that get deployed to a cluster. ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is the fundamental deployment unit used in Fleet. The\ncontents of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," may be Kubernetes manifests, Kustomize configuration, or Helm charts.\nRegardless of the source the contents are dynamically rendered into a Helm chart by the agent\nand installed into the downstream cluster as a helm release."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"To see the ",(0,a.yg)("strong",{parentName:"li"},"life cycle of a bundle"),", click ",(0,a.yg)("a",{parentName:"li",href:"/0.9/ref-bundle-stages"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"BundleDeployment"),": When a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is deployed to a cluster an instance of a ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," is called a ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment"),".\nA ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," represents the state of that ",(0,a.yg)("inlineCode",{parentName:"p"},"Bundle")," on a specific cluster with its cluster specific\ncustomizations. The Fleet agent is only aware of ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," resources that are created for\nthe cluster the agent is managing."),(0,a.yg)("ul",{parentName:"li"},(0,a.yg)("li",{parentName:"ul"},"For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click ",(0,a.yg)("a",{parentName:"li",href:"/0.9/gitrepo-targets#customization-per-cluster"},"here"),"."))),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Downstream Cluster"),": Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster Registration Token"),": Tokens used by agents to register a new cluster."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e4b5e952.02309ac9.js b/assets/js/e4b5e952.851dd734.js similarity index 61% rename from assets/js/e4b5e952.02309ac9.js rename to assets/js/e4b5e952.851dd734.js index 2fc0426de..3bddf6032 100644 --- a/assets/js/e4b5e952.02309ac9.js +++ b/assets/js/e4b5e952.851dd734.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9184],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4834:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.9/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.9/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.9/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/quickstart.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.9/"},next:{title:"Creating a Deployment",permalink:"/0.9/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9184],{9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),l=a(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,l.A)(r.tabItem,s),hidden:a},t)}},1470:(e,t,a)=>{a.d(t,{A:()=>k});var n=a(8168),l=a(6540),r=a(53),s=a(3104),o=a(6347),u=a(7485),i=a(1682),c=a(9466);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:l}}=e;return{value:t,label:a,attributes:n,default:l}}))}function p(e){const{values:t,children:a}=e;return(0,l.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function h(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function m(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.W6)(),r=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,u.aZ)(r),(0,l.useCallback)((e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})}),[r,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,r=p(e),[s,o]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!h({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:r}))),[u,i]=m({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,r]=(0,c.Dv)(a);return[n,(0,l.useCallback)((e=>{a&&r.set(e)}),[a,r])]}({groupId:n}),g=(()=>{const e=u??d;return h({value:e,tabValues:r})?e:null})();(0,l.useLayoutEffect)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,l.useCallback)((e=>{if(!h({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);o(e),i(e),f(e)}),[i,f,r]),tabValues:r}}var g=a(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:o,selectValue:u,tabValues:i}=e;const c=[],{blockElementScrollPositionUntilNextRender:d}=(0,s.a_)(),p=e=>{const t=e.currentTarget,a=c.indexOf(t),n=i[a].value;n!==o&&(d(t),u(n))},h=e=>{let t=null;switch(e.key){case"Enter":p(e);break;case"ArrowRight":{const a=c.indexOf(e.currentTarget)+1;t=c[a]??c[0];break}case"ArrowLeft":{const a=c.indexOf(e.currentTarget)-1;t=c[a]??c[c.length-1];break}}t?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":a},t)},i.map((e=>{let{value:t,label:a,attributes:s}=e;return l.createElement("li",(0,n.A)({role:"tab",tabIndex:o===t?0:-1,"aria-selected":o===t,key:t,ref:e=>c.push(e),onKeyDown:h,onClick:p},s,{className:(0,r.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":o===t})}),a??t)})))}function v(e){let{lazy:t,children:a,selectedValue:n}=e;const r=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===n));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function w(e){const t=f(e);return l.createElement("div",{className:(0,r.A)("tabs-container",b.tabList)},l.createElement(y,(0,n.A)({},e,t)),l.createElement(v,(0,n.A)({},e,t)))}function k(e){const t=(0,g.A)();return l.createElement(w,(0,n.A)({key:String(t)},e))}},7858:(e,t,a)=>{a.d(t,{e:()=>n});const n={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},4834:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var n=a(8168),l=(a(6540),a(5680)),r=(a(7858),a(2355)),s=a(1470),o=a(9365);const u={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.9/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.9/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.9/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/quickstart.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.9/"},next:{title:"Creating a Deployment",permalink:"/0.9/tut-deployment"}},d={},p=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to Watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],h={toc:p},m="wrapper";function f(e){let{components:t,...u}=e;return(0,l.yg)(m,(0,n.A)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"quick-start"},"Quick Start"),(0,l.yg)("p",null,(0,l.yg)("img",{src:a(2614).A,width:"520",height:"279"})),(0,l.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,l.yg)("h2",{id:"install"},"Install"),(0,l.yg)("p",null," Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is\nfairly straightforward. To install the Helm 3 CLI follow the ",(0,l.yg)("a",{href:"https://helm.sh/docs/intro/install"},"official install instructions"),"."),(0,l.yg)("admonition",{title:"Fleet in Rancher",type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Rancher has separate helm charts for Fleet and uses a different repository.")),(0,l.yg)(s.A,{mdxType:"Tabs"},(0,l.yg)(o.A,{value:"linux",label:"Linux/Mac",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"brew install helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/")),(0,l.yg)(o.A,{value:"windows",label:"Windows",default:!0,mdxType:"TabItem"},(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"choco install kubernetes-helm\n","helm repo add fleet https://rancher.github.io/fleet-helm-charts/"))),(0,l.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,l.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \\\n fleet/fleet-crd\n","helm -n cattle-fleet-system install --create-namespace --wait fleet \\\n fleet/fleet"),(0,l.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to Watch"),(0,l.yg)("p",null,"Change ",(0,l.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,l.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,l.yg)("h2",{id:"get-status"},"Get Status"),(0,l.yg)("p",null,"Get status of what fleet is doing"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,l.yg)("p",null,"You should see something like this get created in your cluster."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,l.yg)("p",null,"Enjoy and read the ",(0,l.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}f.isMDXComponent=!0},2614:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/e50ee9c3.0161833d.js b/assets/js/e50ee9c3.0161833d.js new file mode 100644 index 000000000..ddc82ff9d --- /dev/null +++ b/assets/js/e50ee9c3.0161833d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3160],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.8/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.8/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.8/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cluster-bundles-state.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.8/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.8/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e50ee9c3.35e47d55.js b/assets/js/e50ee9c3.35e47d55.js deleted file mode 100644 index 5b035afa8..000000000 --- a/assets/js/e50ee9c3.35e47d55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3160],{5680:(e,t,n)=>{n.d(t,{xA:()=>d,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),i=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=i(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},y=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=i(n),y=a,g=p["".concat(u,".").concat(y)]||p[y]||c[y]||l;return n?r.createElement(g,s(s({ref:t},d),{},{components:n})):r.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,s=new Array(l);s[0]=y;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o[p]="string"==typeof e?e:a,s[1]=o;for(var i=2;i{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>i});var r=n(8168),a=(n(6540),n(5680));const l={},s="Cluster and Bundle State",o={unversionedId:"cluster-bundles-state",id:"version-0.8/cluster-bundles-state",title:"Cluster and Bundle State",description:"Clusters and Bundles have different states in each phase of applying Bundles.",source:"@site/versioned_docs/version-0.8/cluster-bundles-state.md",sourceDirName:".",slug:"/cluster-bundles-state",permalink:"/0.8/cluster-bundles-state",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/cluster-bundles-state.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"fleet-manager",permalink:"/0.8/cli/fleet-controller/fleet-manager"},next:{title:"Cluster Registration Internals",permalink:"/0.8/ref-registration"}},u={},i=[{value:"Bundles",id:"bundles",level:2},{value:"Clusters",id:"clusters",level:2}],d={toc:i},p="wrapper";function c(e){let{components:t,...n}=e;return(0,a.yg)(p,(0,r.A)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"cluster-and-bundle-state"},"Cluster and Bundle State"),(0,a.yg)("p",null,"Clusters and Bundles have different states in each phase of applying Bundles."),(0,a.yg)("h2",{id:"bundles"},"Bundles"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles have been deployed and all resources are ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": Bundles have been deployed and some resources are not ready."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": Bundles are being processed by Fleet controller."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository."),(0,a.yg)("h2",{id:"clusters"},"Clusters"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn"),": Waiting for agent to report registration information and cluster status back."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"NotReady"),": There are bundles in this cluster that are in NotReady state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"WaitApplied"),": There are bundles in this cluster that are in WaitApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"ErrApplied"),": There are bundles in this cluster that are in ErrApplied state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"OutOfSync"),": There are bundles in this cluster that are in OutOfSync state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Pending"),": There are bundles in this cluster that are in Pending state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified"),": There are bundles in this cluster that are in Modified state."),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Ready"),": Bundles in this cluster have been deployed and all resources are ready."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e6339806.57b9f2a1.js b/assets/js/e6339806.41cf0b18.js similarity index 73% rename from assets/js/e6339806.57b9f2a1.js rename to assets/js/e6339806.41cf0b18.js index 283644c29..119b510a1 100644 --- a/assets/js/e6339806.57b9f2a1.js +++ b/assets/js/e6339806.41cf0b18.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1685],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.9/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.9/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.9/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/uninstall.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.9/tut-deployment"},next:{title:"Architecture",permalink:"/0.9/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1685],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.9/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.9/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.9/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/uninstall.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.9/tut-deployment"},next:{title:"Architecture",permalink:"/0.9/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e6bd2de8.8e479b82.js b/assets/js/e6bd2de8.ac50b5e6.js similarity index 61% rename from assets/js/e6bd2de8.8e479b82.js rename to assets/js/e6bd2de8.ac50b5e6.js index 9895bbd59..5d4f6b832 100644 --- a/assets/js/e6bd2de8.8e479b82.js +++ b/assets/js/e6bd2de8.ac50b5e6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2973],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var l=r(6540);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,l)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=l.createContext({}),p=function(e){var t=l.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},y=l.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),s=p(r),y=n,d=s["".concat(c,".").concat(y)]||s[y]||u[y]||a;return r?l.createElement(d,o(o({ref:t},f),{},{components:r})):l.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=y;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var l=r(8168),n=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.10/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.10/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent register",permalink:"/0.10/cli/fleet-agent/fleet-agent_register"},next:{title:"fleet apply",permalink:"/0.10/cli/fleet-cli/fleet_apply"}},c={},p=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},s="wrapper";function u(e){let{components:t,...r}=e;return(0,n.yg)(s,(0,l.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"fleet"},"fleet"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,n.yg)("h3",{id:"options"},"Options"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"}," -h, --help help for fleet\n")),(0,n.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Create bundles from directories, and output them or apply them on a cluster"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_cleanup"},"fleet cleanup"),"\t - Clean up outdated cluster registrations"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_deploy"},"fleet deploy"),"\t - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_gitcloner"},"fleet gitcloner"),"\t - Clones a git repository"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_target"},"fleet target"),"\t - Print available targets for a bundle")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2973],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var l=r(6540);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,l)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=l.createContext({}),p=function(e){var t=l.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},y=l.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,c=e.parentName,f=i(e,["components","mdxType","originalType","parentName"]),s=p(r),y=n,d=s["".concat(c,".").concat(y)]||s[y]||u[y]||a;return r?l.createElement(d,o(o({ref:t},f),{},{components:r})):l.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,o=new Array(a);o[0]=y;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var l=r(8168),n=(r(6540),r(5680));const a={title:"",sidebar_label:"fleet"},o=void 0,i={unversionedId:"cli/fleet-cli/fleet",id:"version-0.10/cli/fleet-cli/fleet",title:"",description:"fleet",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet",permalink:"/0.10/cli/fleet-cli/fleet",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet"},sidebar:"docs",previous:{title:"fleet-agent register",permalink:"/0.10/cli/fleet-agent/fleet-agent_register"},next:{title:"fleet apply",permalink:"/0.10/cli/fleet-cli/fleet_apply"}},c={},p=[{value:"fleet",id:"fleet",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},s="wrapper";function u(e){let{components:t,...r}=e;return(0,n.yg)(s,(0,l.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h2",{id:"fleet"},"fleet"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"fleet [flags]\n")),(0,n.yg)("h3",{id:"options"},"Options"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"}," -h, --help help for fleet\n")),(0,n.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_apply"},"fleet apply"),"\t - Create bundles from directories, and output them or apply them on a cluster"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_cleanup"},"fleet cleanup"),"\t - Clean up outdated cluster registrations"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_deploy"},"fleet deploy"),"\t - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_gitcloner"},"fleet gitcloner"),"\t - Clones a git repository"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("a",{parentName:"li",href:"./fleet_target"},"fleet target"),"\t - Print available targets for a bundle")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e7acee98.c0d81965.js b/assets/js/e7acee98.b0bb1819.js similarity index 77% rename from assets/js/e7acee98.c0d81965.js rename to assets/js/e7acee98.b0bb1819.js index dacbfbe8e..c4f819047 100644 --- a/assets/js/e7acee98.c0d81965.js +++ b/assets/js/e7acee98.b0bb1819.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9218],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,i=new Array(s);i[0]=m;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},i="Custom Resources During Deployment",a={unversionedId:"resources-during-deployment",id:"version-0.9/resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.9/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/0.9/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/resources-during-deployment.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.9/namespaces"},next:{title:"Installation Details",permalink:"/0.9/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9218],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,i=new Array(s);i[0]=m;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},i="Custom Resources During Deployment",a={unversionedId:"resources-during-deployment",id:"version-0.9/resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.9/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/0.9/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/resources-during-deployment.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.9/namespaces"},next:{title:"Installation Details",permalink:"/0.9/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file diff --git a/assets/js/e89d2f4d.63e3ba1d.js b/assets/js/e89d2f4d.82f3bac8.js similarity index 73% rename from assets/js/e89d2f4d.63e3ba1d.js rename to assets/js/e89d2f4d.82f3bac8.js index 0a448d680..7d66c1ec1 100644 --- a/assets/js/e89d2f4d.63e3ba1d.js +++ b/assets/js/e89d2f4d.82f3bac8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1595],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.6/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.6/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.6/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/uninstall.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.6/tut-deployment"},next:{title:"Architecture",permalink:"/0.6/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1595],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>f});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),d=l,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,o=new Array(a);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const a={},o="Uninstall",i={unversionedId:"uninstall",id:"version-0.6/uninstall",title:"Uninstall",description:"Fleet is packaged as two Helm charts so uninstall is accomplished by",source:"@site/versioned_docs/version-0.6/uninstall.md",sourceDirName:".",slug:"/uninstall",permalink:"/0.6/uninstall",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/uninstall.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Creating a Deployment",permalink:"/0.6/tut-deployment"},next:{title:"Architecture",permalink:"/0.6/architecture"}},s={},c=[],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,l.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"uninstall"},"Uninstall"),(0,l.yg)("p",null,"Fleet is packaged as two Helm charts so uninstall is accomplished by\nuninstalling the appropriate Helm charts. To uninstall Fleet run the following\ntwo commands:"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"helm -n cattle-fleet-system uninstall fleet\nhelm -n cattle-fleet-system uninstall fleet-crd\n")),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},"Uninstalling the CRDs will remove all deployed workloads.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e9be1565.f7033012.js b/assets/js/e9be1565.f0b6edce.js similarity index 79% rename from assets/js/e9be1565.f7033012.js rename to assets/js/e9be1565.f0b6edce.js index a444d3743..b8ed9e3b6 100644 --- a/assets/js/e9be1565.f7033012.js +++ b/assets/js/e9be1565.f0b6edce.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6176],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,i=new Array(s);i[0]=m;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},i="Custom Resources During Deployment",a={unversionedId:"resources-during-deployment",id:"version-0.10/resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.10/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/0.10/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/resources-during-deployment.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.10/namespaces"},next:{title:"Installation Details",permalink:"/0.10/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6176],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>y});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,c=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=l(r),m=o,y=p["".concat(c,".").concat(m)]||p[m]||d[m]||s;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,i=new Array(s);i[0]=m;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=r(8168),o=(r(6540),r(5680));const s={},i="Custom Resources During Deployment",a={unversionedId:"resources-during-deployment",id:"version-0.10/resources-during-deployment",title:"Custom Resources During Deployment",description:"This shows the resources, also the internal ones, involved in creating a deployment from a git repository.",source:"@site/versioned_docs/version-0.10/resources-during-deployment.md",sourceDirName:".",slug:"/resources-during-deployment",permalink:"/0.10/resources-during-deployment",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/resources-during-deployment.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Namespaces",permalink:"/0.10/namespaces"},next:{title:"Installation Details",permalink:"/0.10/installation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...s}=e;return(0,o.yg)(p,(0,n.A)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"custom-resources-during-deployment"},"Custom Resources During Deployment"),(0,o.yg)("p",null,"This shows the resources, also the internal ones, involved in creating a deployment from a git repository."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Resources",src:r(4467).A,width:"831",height:"1341"})))}d.isMDXComponent=!0},4467:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/FleetResources-66df436672452ab68d89ed76da51a7bb.svg"}}]); \ No newline at end of file diff --git a/assets/js/e9efc8c6.19803041.js b/assets/js/e9efc8c6.19803041.js deleted file mode 100644 index e832bb128..000000000 --- a/assets/js/e9efc8c6.19803041.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6026],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.7/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.7/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.7/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/bundle-diffs.md",tags:[],version:"0.7",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.7/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.7/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/e9efc8c6.a134beb3.js b/assets/js/e9efc8c6.a134beb3.js new file mode 100644 index 000000000..ef90d26dc --- /dev/null +++ b/assets/js/e9efc8c6.a134beb3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6026],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=a.createContext({}),p=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(l.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(l,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[d]="string"==typeof e?e:o,r[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",s={unversionedId:"bundle-diffs",id:"version-0.7/bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/versioned_docs/version-0.7/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/0.7/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/bundle-diffs.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/0.7/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/0.7/webhook"}},l={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-examples/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/ea61e9e9.d5b15998.js b/assets/js/ea61e9e9.d5b15998.js deleted file mode 100644 index b078ff432..000000000 --- a/assets/js/ea61e9e9.d5b15998.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7666],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=s(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.10/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.10/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.10/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/gitrepo-add.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.10/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.10/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:3},{value:"Override Workload's Namespace",id:"override-workloads-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Known hosts",id:"known-hosts",level:3},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],c={toc:s},d="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.10/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.10/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h3",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"override-workloads-namespace"},"Override Workload's Namespace"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetNamespace")," field will override any namespace in the bundle. If the deployment contains cluster scoped resources, it will fail."),(0,r.yg)("p",null,"It takes precendence over all other namespace definitions:"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.targetNamespace > fleet.yaml namespace > namespace in workload's manifest > fleet.yaml defaultNamespace")),(0,r.yg)("p",null,"Workload namespace definitions can be restricted with ",(0,r.yg)("inlineCode",{parentName:"p"},"allowedTargetNamespaces")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resource."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("p",null,"Now the ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName")," must be specified in the repo definition:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample-ssh\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "git@github.com:rancher/fleet-examples"\n # or\n # repo: "ssh://git@github.com/rancher/fleet-examples"\n clientSecretName: ssh-key\n paths:\n - simple\n')),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("h3",{id:"known-hosts"},"Known hosts"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add one or more public keys into the secret, any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.10/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ea61e9e9.e46c0427.js b/assets/js/ea61e9e9.e46c0427.js new file mode 100644 index 000000000..6910b7f52 --- /dev/null +++ b/assets/js/ea61e9e9.e46c0427.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7666],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>h});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=s(a),m=r,h=d["".concat(p,".").concat(m)]||d[m]||g[m]||i;return a?n.createElement(h,l(l({ref:t},c),{},{components:a})):n.createElement(h,l({ref:t},c))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=a(8168),r=(a(6540),a(5680));const i={},l="Create a GitRepo Resource",o={unversionedId:"gitrepo-add",id:"version-0.10/gitrepo-add",title:"Create a GitRepo Resource",description:"Create GitRepo Instance",source:"@site/versioned_docs/version-0.10/gitrepo-add.md",sourceDirName:".",slug:"/gitrepo-add",permalink:"/0.10/gitrepo-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/gitrepo-add.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Setup Multi User",permalink:"/0.10/multi-user"},next:{title:"Mapping to Downstream Clusters",permalink:"/0.10/gitrepo-targets"}},p={},s=[{value:"Create GitRepo Instance",id:"create-gitrepo-instance",level:2},{value:"Proper Namespace",id:"proper-namespace",level:3},{value:"Override Workload's Namespace",id:"override-workloads-namespace",level:2},{value:"Adding Private Git Repository",id:"adding-private-git-repository",level:2},{value:"Known hosts",id:"known-hosts",level:3},{value:"Using HTTP Auth",id:"using-http-auth",level:3},{value:"Using Private Helm Repositories",id:"using-private-helm-repositories",level:2},{value:"Use different helm credentials for each path",id:"use-different-helm-credentials-for-each-path",level:3}],c={toc:s},d="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-gitrepo-resource"},"Create a GitRepo Resource"),(0,r.yg)("h2",{id:"create-gitrepo-instance"},"Create GitRepo Instance"),(0,r.yg)("p",null,"Git repositories are registered by creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," resource in Kubernetes. Refer\nto the ",(0,r.yg)("a",{parentName:"p",href:"/0.10/tut-deployment"},"creating a deployment tutorial")," for examples."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"/0.10/gitrepo-content"},"Git Repository Contents")," has detail about the content of the Git repository."),(0,r.yg)("p",null,"The available fields of the GitRepo custom resource are documented in the ",(0,r.yg)("a",{parentName:"p",href:"/0.10/ref-gitrepo"},"GitRepo resource reference")),(0,r.yg)("h3",{id:"proper-namespace"},"Proper Namespace"),(0,r.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,r.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"fleet-local")," will contain the local cluster by default.")),(0,r.yg)("p",null,"If you are using Fleet in a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"single cluster")," style, the namespace will always be ",(0,r.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,r.yg)("p",null,"For a ",(0,r.yg)("a",{parentName:"p",href:"/0.10/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,r.yg)("h2",{id:"override-workloads-namespace"},"Override Workload's Namespace"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"targetNamespace")," field will override any namespace in the bundle. If the deployment contains cluster scoped resources, it will fail."),(0,r.yg)("p",null,"It takes precendence over all other namespace definitions:"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.targetNamespace > fleet.yaml namespace > namespace in workload's manifest > fleet.yaml defaultNamespace")),(0,r.yg)("p",null,"Workload namespace definitions can be restricted with ",(0,r.yg)("inlineCode",{parentName:"p"},"allowedTargetNamespaces")," in the ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resource."),(0,r.yg)("h2",{id:"adding-private-git-repository"},"Adding Private Git Repository"),(0,r.yg)("p",null,"Fleet supports both http and ssh auth key for private repository. To use this you have to create a secret in the same namespace."),(0,r.yg)("p",null,"For example, to generate a private ssh key"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'ssh-keygen -t rsa -b 4096 -m pem -C "user@email.com"\n')),(0,r.yg)("p",null,"Note: The private key format has to be in ",(0,r.yg)("inlineCode",{parentName:"p"},"EC PRIVATE KEY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"RSA PRIVATE KEY")," or ",(0,r.yg)("inlineCode",{parentName:"p"},"PRIVATE KEY")," and should not contain a passphase."),(0,r.yg)("p",null,"Put your private key into secret, use the namespace the GitRepo is in:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"kubectl create secret generic ssh-key -n fleet-default --from-file=ssh-privatekey=/file/to/private/key --type=kubernetes.io/ssh-auth\n")),(0,r.yg)("p",null,"Now the ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName")," must be specified in the repo definition:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},'apiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample-ssh\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "git@github.com:rancher/fleet-examples"\n # or\n # repo: "ssh://git@github.com/rancher/fleet-examples"\n clientSecretName: ssh-key\n paths:\n - simple\n')),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"Private key with passphrase is not supported.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"The key has to be in PEM format.")),(0,r.yg)("h3",{id:"known-hosts"},"Known hosts"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"If you don't add one or more public keys into the secret, any server's public key will be trusted and added. (",(0,r.yg)("inlineCode",{parentName:"p"},"ssh -o stricthostkeychecking=accept-new")," will be used)")),(0,r.yg)("p",null,"Fleet supports putting ",(0,r.yg)("inlineCode",{parentName:"p"},"known_hosts")," into ssh secret. Here is an example of how to add it:"),(0,r.yg)("p",null,"Fetch the public key hash(take github as an example)"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"ssh-keyscan -H github.com\n")),(0,r.yg)("p",null,"And add it into secret:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"apiVersion: v1\nkind: Secret\nmetadata:\n name: ssh-key\ntype: kubernetes.io/ssh-auth\nstringData:\n ssh-privatekey: \n known_hosts: |-\n |1|YJr1VZoi6dM0oE+zkM0do3Z04TQ=|7MclCn1fLROZG+BgR4m1r8TLwWc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n")),(0,r.yg)("h3",{id:"using-http-auth"},"Using HTTP Auth"),(0,r.yg)("p",null,"Create a secret containing username and password. You can replace the password with a personal access token if necessary. Also see ",(0,r.yg)("a",{parentName:"p",href:"./troubleshooting#http-secrets-in-github"},"HTTP secrets in Github"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic basic-auth-secret -n fleet-default --type=kubernetes.io/basic-auth --from-literal=username=$user --from-literal=password=$pat\n")),(0,r.yg)("p",null,"Just like with SSH, reference the secret in your GitRepo resource via ",(0,r.yg)("inlineCode",{parentName:"p"},"clientSecretName"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"spec:\n repo: https://github.com/fleetrepoci/gitjob-private.git\n branch: main\n clientSecretName: basic-auth-secret\n")),(0,r.yg)("h2",{id:"using-private-helm-repositories"},"Using Private Helm Repositories"),(0,r.yg)("admonition",{type:"warning"},(0,r.yg)("p",{parentName:"admonition"},"The credentials will be used unconditionally for all Helm repositories referenced by the gitrepo resource.\nMake sure you don't leak credentials by mixing public and private repositories. Use ",(0,r.yg)("a",{parentName:"p",href:"#use-different-helm-credentials-for-each-path"},"different helm credentials for each path"),",\nor split them into different gitrepos, or use ",(0,r.yg)("inlineCode",{parentName:"p"},"helmRepoURLRegex")," to limit the scope of credentials to certain servers.")),(0,r.yg)("p",null,"For a private Helm repo, users can reference a secret with the following keys:"),(0,r.yg)("ol",null,(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"username")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"password")," for basic http auth if the Helm HTTP repo is behind basic auth.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"cacerts")," for custom CA bundle if the Helm repo is using a custom CA.")),(0,r.yg)("li",{parentName:"ol"},(0,r.yg)("p",{parentName:"li"},(0,r.yg)("inlineCode",{parentName:"p"},"ssh-privatekey")," for ssh private key if repo is using ssh protocol. Private key with passphase is not supported currently."))),(0,r.yg)("p",null,"For example, to add a secret in kubectl, run"),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"kubectl create secret -n $namespace generic helm --from-literal=username=foo --from-literal=password=bar --from-file=cacerts=/path/to/cacerts --from-file=ssh-privatekey=/path/to/privatekey.pem")),(0,r.yg)("p",null,"After secret is created, specify the secret to ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName"),". Make sure secret is created under the same namespace with gitrepo."),(0,r.yg)("h3",{id:"use-different-helm-credentials-for-each-path"},"Use different helm credentials for each path"),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretName")," will be ignored if ",(0,r.yg)("inlineCode",{parentName:"p"},"gitRepo.spec.helmSecretNameForPaths")," is provided")),(0,r.yg)("p",null,"Create a file ",(0,r.yg)("inlineCode",{parentName:"p"},"secrets-path.yaml")," that contains credentials for each path defined in a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),". Credentials will not be used\nfor paths that are not present in this file.\nThe path is the actual path to the bundle (ie to a folder containing a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file) within the git repository, which might have more segments than the entry under ",(0,r.yg)("inlineCode",{parentName:"p"},"paths:"),"."),(0,r.yg)("p",null,"Example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"path-one: # path path-one must exist in the repository\n username: user\n password: pass\npath-two: # path path-one must exist in the repository\n username: user2\n password: pass2\n caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=\n sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n")),(0,r.yg)("p",null,"Create the secret"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml\n")),(0,r.yg)("p",null,"In the previous example credentials for username ",(0,r.yg)("inlineCode",{parentName:"p"},"user")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-one")," and credentials for username\n",(0,r.yg)("inlineCode",{parentName:"p"},"user2")," will be used for the path ",(0,r.yg)("inlineCode",{parentName:"p"},"path-two"),"."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"caBundle")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"sshPrivateKey")," must be base64 encoded."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"If you are using ",(0,r.yg)("a",{parentName:"p",href:"https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery/back-up-rancher"},'"rancher-backups"')," and want this secret to be included the backup, please add the label ",(0,r.yg)("inlineCode",{parentName:"p"},"resources.cattle.io/backup: true")," to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials."),(0,r.yg)("h1",{parentName:"admonition",id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("p",{parentName:"admonition"},"See Fleet Troubleshooting section ",(0,r.yg)("a",{parentName:"p",href:"/0.10/troubleshooting"},"here"),".")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eb9f028f.9e1b0393.js b/assets/js/eb9f028f.d0eaab18.js similarity index 63% rename from assets/js/eb9f028f.9e1b0393.js rename to assets/js/eb9f028f.d0eaab18.js index d76411a67..0de700a10 100644 --- a/assets/js/eb9f028f.9e1b0393.js +++ b/assets/js/eb9f028f.d0eaab18.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7791],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>u});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=r.createContext({}),p=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},f=function(e){var t=p(e.components);return r.createElement(i.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),m=p(n),g=l,u=m["".concat(i,".").concat(g)]||m[g]||s[g]||o;return n?r.createElement(u,a(a({ref:t},f),{},{components:n})):r.createElement(u,a({ref:t},f))}));function u(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=g;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[m]="string"==typeof e?e:l,a[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleetcontroller agentmanagement"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller_agentmanagement",id:"version-0.10/cli/fleet-controller/fleetcontroller_agentmanagement",title:"",description:"fleetcontroller agentmanagement",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_agentmanagement.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_agentmanagement",permalink:"/0.10/cli/fleet-controller/fleetcontroller_agentmanagement",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_agentmanagement.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller agentmanagement"},sidebar:"docs",previous:{title:"fleetcontroller",permalink:"/0.10/cli/fleet-controller/fleetcontroller"},next:{title:"fleetcontroller cleanup",permalink:"/0.10/cli/fleet-controller/fleetcontroller_cleanup"}},i={},p=[{value:"fleetcontroller agentmanagement",id:"fleetcontroller-agentmanagement",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},m="wrapper";function s(e){let{components:t,...n}=e;return(0,l.yg)(m,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-agentmanagement"},"fleetcontroller agentmanagement"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller agentmanagement [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --disable-bootstrap disable local cluster components\n -h, --help help for agentmanagement\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7791],{5680:(e,t,n)=>{n.d(t,{xA:()=>f,yg:()=>u});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=r.createContext({}),p=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},f=function(e){var t=p(e.components);return r.createElement(i.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,i=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),m=p(n),g=l,u=m["".concat(i,".").concat(g)]||m[g]||s[g]||o;return n?r.createElement(u,a(a({ref:t},f),{},{components:n})):r.createElement(u,a({ref:t},f))}));function u(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=g;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[m]="string"==typeof e?e:l,a[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleetcontroller agentmanagement"},a=void 0,c={unversionedId:"cli/fleet-controller/fleetcontroller_agentmanagement",id:"version-0.10/cli/fleet-controller/fleetcontroller_agentmanagement",title:"",description:"fleetcontroller agentmanagement",source:"@site/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_agentmanagement.md",sourceDirName:"cli/fleet-controller",slug:"/cli/fleet-controller/fleetcontroller_agentmanagement",permalink:"/0.10/cli/fleet-controller/fleetcontroller_agentmanagement",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-controller/fleetcontroller_agentmanagement.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleetcontroller agentmanagement"},sidebar:"docs",previous:{title:"fleetcontroller",permalink:"/0.10/cli/fleet-controller/fleetcontroller"},next:{title:"fleetcontroller cleanup",permalink:"/0.10/cli/fleet-controller/fleetcontroller_cleanup"}},i={},p=[{value:"fleetcontroller agentmanagement",id:"fleetcontroller-agentmanagement",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:p},m="wrapper";function s(e){let{components:t,...n}=e;return(0,l.yg)(m,(0,r.A)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleetcontroller-agentmanagement"},"fleetcontroller agentmanagement"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleetcontroller agentmanagement [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --disable-bootstrap disable local cluster components\n -h, --help help for agentmanagement\n --kubeconfig string kubeconfig file\n --namespace string namespace to watch\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleetcontroller"},"fleetcontroller"),"\t -")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ebf52154.44e244a3.js b/assets/js/ebf52154.44e244a3.js deleted file mode 100644 index 565fc3498..000000000 --- a/assets/js/ebf52154.44e244a3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3081],{7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5710:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var l=a(8168),n=(a(6540),a(5680)),s=a(7858),r=a(2355);const o={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.5/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.5/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.5/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/quickstart.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.5/"},next:{title:"Core Concepts",permalink:"/0.5/concepts"}},d={},u=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],p={toc:u},h="wrapper";function g(e){let{components:t,...a}=e;return(0,n.yg)(h,(0,l.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"quick-start"},"Quick Start"),(0,n.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,n.yg)("h2",{id:"install"},"Install"),(0,n.yg)("p",null,"Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure\nthings to your cluster."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,n.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",s.e["v0.5"].fleetCRD,"\nhelm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",s.e["v0.5"].fleet),(0,n.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to watch"),(0,n.yg)("p",null,"Change ",(0,n.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,n.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,n.yg)("h2",{id:"get-status"},"Get Status"),(0,n.yg)("p",null,"Get status of what fleet is doing"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,n.yg)("p",null,"You should see something like this get created in your cluster."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,n.yg)("p",null,"Enjoy and read the ",(0,n.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ebf52154.854c4843.js b/assets/js/ebf52154.854c4843.js new file mode 100644 index 000000000..11fd504ab --- /dev/null +++ b/assets/js/ebf52154.854c4843.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3081],{7858:(e,t,a)=>{a.d(t,{e:()=>l});const l={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5710:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var l=a(8168),n=(a(6540),a(5680)),s=a(7858),r=a(2355);const o={},i="Quick Start",c={unversionedId:"quickstart",id:"version-0.5/quickstart",title:"Quick Start",description:"Who needs documentation, lets just run this thing!",source:"@site/versioned_docs/version-0.5/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/0.5/quickstart",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/quickstart.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Overview",permalink:"/0.5/"},next:{title:"Core Concepts",permalink:"/0.5/concepts"}},d={},u=[{value:"Install",id:"install",level:2},{value:"Add a Git Repo to watch",id:"add-a-git-repo-to-watch",level:2},{value:"Get Status",id:"get-status",level:2}],p={toc:u},h="wrapper";function g(e){let{components:t,...a}=e;return(0,n.yg)(h,(0,l.A)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"quick-start"},"Quick Start"),(0,n.yg)("p",null,"Who needs documentation, lets just run this thing!"),(0,n.yg)("h2",{id:"install"},"Install"),(0,n.yg)("p",null,"Get helm if you don't have it. Helm 3 is just a CLI and won't do bad insecure\nthings to your cluster."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,n.yg)("p",null,"Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)"),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",s.e["v0.5"].fleetCRD,"\nhelm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",s.e["v0.5"].fleet),(0,n.yg)("h2",{id:"add-a-git-repo-to-watch"},"Add a Git Repo to watch"),(0,n.yg)("p",null,"Change ",(0,n.yg)("inlineCode",{parentName:"p"},"spec.repo")," to your git repo of choice. Kubernetes manifest files that should\nbe deployed should be in ",(0,n.yg)("inlineCode",{parentName:"p"},"/manifests")," in your repo."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},'cat > example.yaml << "EOF"\napiVersion: fleet.cattle.io/v1alpha1\nkind: GitRepo\nmetadata:\n name: sample\n # This namespace is special and auto-wired to deploy to the local cluster\n namespace: fleet-local\nspec:\n # Everything from this repo will be run in this cluster. You trust me right?\n repo: "https://github.com/rancher/fleet-examples"\n paths:\n - simple\nEOF\n\nkubectl apply -f example.yaml\n')),(0,n.yg)("h2",{id:"get-status"},"Get Status"),(0,n.yg)("p",null,"Get status of what fleet is doing"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n fleet-local get fleet\n")),(0,n.yg)("p",null,"You should see something like this get created in your cluster."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"kubectl get deploy frontend\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY UP-TO-DATE AVAILABLE AGE\nfrontend 3/3 3 3 116m\n")),(0,n.yg)("p",null,"Enjoy and read the ",(0,n.yg)("a",{parentName:"p",href:"https://rancher.github.io/fleet"},"docs"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ec9fa214.4e0529b3.js b/assets/js/ec9fa214.4e0529b3.js deleted file mode 100644 index 33ce53de3..000000000 --- a/assets/js/ec9fa214.4e0529b3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4708],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.8/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.8/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.8/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/multi-user.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.8/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.8/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.8/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.8/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/ec9fa214.df9bcc7f.js b/assets/js/ec9fa214.df9bcc7f.js new file mode 100644 index 000000000..8ea08c304 --- /dev/null +++ b/assets/js/ec9fa214.df9bcc7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4708],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.8/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.8/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.8/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/multi-user.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.8/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.8/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.8/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.8/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.8/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/efdff6b0.c6547572.js b/assets/js/efdff6b0.73a3f09e.js similarity index 66% rename from assets/js/efdff6b0.c6547572.js rename to assets/js/efdff6b0.73a3f09e.js index ea464ec9b..646540141 100644 --- a/assets/js/efdff6b0.c6547572.js +++ b/assets/js/efdff6b0.73a3f09e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3342],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var a=n.createContext({}),s=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(a.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,i=e.originalType,a=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),p=s(r),g=l,d=p["".concat(a,".").concat(g)]||p[g]||u[g]||i;return r?n.createElement(d,o(o({ref:t},f),{},{components:r})):n.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var i=r.length,o=new Array(i);o[0]=g;var c={};for(var a in t)hasOwnProperty.call(t,a)&&(c[a]=t[a]);c.originalType=e,c[p]="string"==typeof e?e:l,o[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const i={title:"",sidebar_label:"fleet gitcloner"},o=void 0,c={unversionedId:"cli/fleet-cli/fleet_gitcloner",id:"version-0.10/cli/fleet-cli/fleet_gitcloner",title:"",description:"fleet gitcloner",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_gitcloner.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_gitcloner",permalink:"/0.10/cli/fleet-cli/fleet_gitcloner",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_gitcloner.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet gitcloner"}},a={},s=[{value:"fleet gitcloner",id:"fleet-gitcloner",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-gitcloner"},"fleet gitcloner"),(0,l.yg)("p",null,"Clones a git repository"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet gitcloner [REPO] [PATH] [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --branch string git branch\n --ca-bundle-file string CA bundle file\n -h, --help help for gitcloner\n --insecure-skip-tls do not verify tls certificates\n --known-hosts-file string known hosts file\n --password-file string password file for basic auth\n --revision string git revision\n --ssh-private-key-file string ssh private key file path\n -u, --username string user name for basic auth\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3342],{5680:(e,t,r)=>{r.d(t,{xA:()=>f,yg:()=>d});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var a=n.createContext({}),s=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(a.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,i=e.originalType,a=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),p=s(r),g=l,d=p["".concat(a,".").concat(g)]||p[g]||u[g]||i;return r?n.createElement(d,o(o({ref:t},f),{},{components:r})):n.createElement(d,o({ref:t},f))}));function d(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var i=r.length,o=new Array(i);o[0]=g;var c={};for(var a in t)hasOwnProperty.call(t,a)&&(c[a]=t[a]);c.originalType=e,c[p]="string"==typeof e?e:l,o[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>s});var n=r(8168),l=(r(6540),r(5680));const i={title:"",sidebar_label:"fleet gitcloner"},o=void 0,c={unversionedId:"cli/fleet-cli/fleet_gitcloner",id:"version-0.10/cli/fleet-cli/fleet_gitcloner",title:"",description:"fleet gitcloner",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_gitcloner.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_gitcloner",permalink:"/0.10/cli/fleet-cli/fleet_gitcloner",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_gitcloner.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet gitcloner"}},a={},s=[{value:"fleet gitcloner",id:"fleet-gitcloner",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],f={toc:s},p="wrapper";function u(e){let{components:t,...r}=e;return(0,l.yg)(p,(0,n.A)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-gitcloner"},"fleet gitcloner"),(0,l.yg)("p",null,"Clones a git repository"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet gitcloner [REPO] [PATH] [flags]\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --branch string git branch\n --ca-bundle-file string CA bundle file\n -h, --help help for gitcloner\n --insecure-skip-tls do not verify tls certificates\n --known-hosts-file string known hosts file\n --password-file string password file for basic auth\n --revision string git revision\n --ssh-private-key-file string ssh private key file path\n -u, --username string user name for basic auth\n")),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/53da1243.e238c149.js b/assets/js/f060f65c.2469a858.js similarity index 83% rename from assets/js/53da1243.e238c149.js rename to assets/js/f060f65c.2469a858.js index 11ddc0e46..1086d8b1d 100644 --- a/assets/js/53da1243.e238c149.js +++ b/assets/js/f060f65c.2469a858.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6652],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.8/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.8/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.8/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/namespaces.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.8/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/0.8/resources-during-deployment"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.8/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.8/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.8/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("p",null,"The cluster registration namespace contains the cluster and the clusterregistration resources, as well as any gitrepos and bundles."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3987],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.9/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.9/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.9/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/namespaces.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.9/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/0.9/resources-during-deployment"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are use in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.9/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.9/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("p",null,"The cluster registration namespace contains the cluster and the clusterregistration resources, as well as any gitrepos and bundles."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/f060f65c.78c65e31.js b/assets/js/f060f65c.78c65e31.js deleted file mode 100644 index 13c34224f..000000000 --- a/assets/js/f060f65c.78c65e31.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3987],{5680:(e,a,t)=>{t.d(a,{xA:()=>c,yg:()=>y});var n=t(6540);function s(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(s[t]=e[t]);return s}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(s[t]=e[t])}return s}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},c=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,s=e.mdxType,l=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(t),u=s,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||l;return t?n.createElement(y,r(r({ref:a},c),{},{components:t})):n.createElement(y,r({ref:a},c))}));function y(e,a){var t=arguments,s=a&&a.mdxType;if("string"==typeof e||s){var l=t.length,r=new Array(l);r[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[m]="string"==typeof e?e:s,r[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(8168),s=(t(6540),t(5680));const l={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.9/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.9/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.9/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/namespaces.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Git Repository Contents",permalink:"/0.9/gitrepo-content"},next:{title:"Custom Resources During Deployment",permalink:"/0.9/resources-during-deployment"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"GitRepo Namespace",id:"gitrepo-namespace",level:3},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local (local workspace, cluster registration namespace)",id:"fleet-local-local-workspace-cluster-registration-namespace",level:3},{value:"cattle-fleet-system (system namespace)",id:"cattle-fleet-system-system-namespace",level:3},{value:"cattle-fleet-clusters-system (system registration namespace)",id:"cattle-fleet-clusters-system-system-registration-namespace",level:3},{value:"Cluster Namespaces",id:"cluster-namespaces",level:3},{value:"Cross Namespace Deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2},{value:"Allowed Target Namespaces",id:"allowed-target-namespaces",level:3}],c={toc:p},m="wrapper";function d(e){let{components:a,...l}=e;return(0,s.yg)(m,(0,n.A)({},c,l,{components:a,mdxType:"MDXLayout"}),(0,s.yg)("h1",{id:"namespaces"},"Namespaces"),(0,s.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are use in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,s.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,s.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,s.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,s.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,s.yg)("h3",{id:"gitrepo-namespace"},"GitRepo Namespace"),(0,s.yg)("p",null,"Git repos are added to the Fleet manager using the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," custom resource type. The ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," type is namespaced. By default, Rancher will create two Fleet workspaces: ",(0,s.yg)("strong",{parentName:"p"},"fleet-default")," and ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),"."),(0,s.yg)("ul",null,(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-default")," will contain all the downstream clusters that are already registered through Rancher."),(0,s.yg)("li",{parentName:"ul"},(0,s.yg)("inlineCode",{parentName:"li"},"Fleet-local")," will contain the local cluster by default.")),(0,s.yg)("p",null,"If you are using Fleet in a ",(0,s.yg)("a",{parentName:"p",href:"/0.9/concepts"},"single cluster")," style, the namespace will always be ",(0,s.yg)("strong",{parentName:"p"},"fleet-local"),". Check ",(0,s.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/namespaces/#fleet-local"},"here")," for more on the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace."),(0,s.yg)("p",null,"For a ",(0,s.yg)("a",{parentName:"p",href:"/0.9/concepts"},"multi-cluster")," style, please ensure you use the correct repo that will map to the right target clusters."),(0,s.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,s.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,s.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,s.yg)("p",null,"An overview of the ",(0,s.yg)("a",{parentName:"p",href:"/0.9/namespaces"},"namespaces")," used by fleet and their resources."),(0,s.yg)("p",null,(0,s.yg)("img",{alt:"Namespace",src:t(2128).A,width:"1437",height:"1731"})),(0,s.yg)("h3",{id:"fleet-local-local-workspace-cluster-registration-namespace"},"fleet-local (local workspace, cluster registration namespace)"),(0,s.yg)("p",null,"The ",(0,s.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,s.yg)("p",null,"When fleet is installed the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,s.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,s.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,s.yg)("inlineCode",{parentName:"p"},"local")," ",(0,s.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,s.yg)("p",null,"The cluster registration namespace contains the cluster and the clusterregistration resources, as well as any gitrepos and bundles."),(0,s.yg)("h3",{id:"cattle-fleet-system-system-namespace"},"cattle-fleet-system (system namespace)"),(0,s.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,s.yg)("h3",{id:"cattle-fleet-clusters-system-system-registration-namespace"},"cattle-fleet-clusters-system (system registration namespace)"),(0,s.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,s.yg)("h3",{id:"cluster-namespaces"},"Cluster Namespaces"),(0,s.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,s.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,s.yg)("h2",{id:"cross-namespace-deployments"},"Cross Namespace Deployments"),(0,s.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,s.yg)("p",null,"If you are creating a ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,s.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,s.yg)("p",null,"A ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,s.yg)("p",null,"If the ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,s.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,s.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,s.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,s.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,s.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,s.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,s.yg)("p",null,"A namespace can contain multiple ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,s.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,s.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,s.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,s.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,s.yg)("pre",null,(0,s.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\nallowedTargetNamespaces: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')),(0,s.yg)("h3",{id:"allowed-target-namespaces"},"Allowed Target Namespaces"),(0,s.yg)("p",null,"This can be used to limit a deployment to a set of namespaces on a downstream cluster.\nIf an allowedTargetNamespaces restriction is present, all ",(0,s.yg)("inlineCode",{parentName:"p"},"GitRepos")," must\nspecify a ",(0,s.yg)("inlineCode",{parentName:"p"},"targetNamespace")," and the specified namespace must be in the allow\nlist.\nThis also prevents the creation of cluster wide resources."))}d.isMDXComponent=!0},2128:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/FleetNamespaces-4e461907ba4d5bbf6b309d125383bdb5.svg"}}]); \ No newline at end of file diff --git a/assets/js/f0907b6d.f74ba205.js b/assets/js/f0907b6d.9c1d969d.js similarity index 82% rename from assets/js/f0907b6d.f74ba205.js rename to assets/js/f0907b6d.9c1d969d.js index 2d55db1ac..27a7ffd00 100644 --- a/assets/js/f0907b6d.f74ba205.js +++ b/assets/js/f0907b6d.9c1d969d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3839],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),g=s(r),f=o,d=g["".concat(i,".").concat(f)]||g[f]||u[f]||a;return r?n.createElement(d,l(l({ref:t},p),{},{components:r})):n.createElement(d,l({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=f;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[g]="string"==typeof e?e:o,l[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.4 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.4/changelogs/index",title:"0.4 Changelogs",description:"* Fleet v0.4.1 (latest)",source:"@site/versioned_docs/version-0.4/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.4/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/changelogs/index.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"0.4 Changelogs"}},i={},s=[],p={toc:s},g="wrapper";function u(e){let{components:t,...r}=e;return(0,o.yg)(g,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.4/changelogs/changelogs/v0.4.1"},"Fleet v0.4.1")," (latest)")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.4/changelogs/changelogs/v0.4.0"},"Fleet v0.4.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3839],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>d});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),g=s(r),f=o,d=g["".concat(i,".").concat(f)]||g[f]||u[f]||a;return r?n.createElement(d,l(l({ref:t},p),{},{components:r})):n.createElement(d,l({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=f;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[g]="string"==typeof e?e:o,l[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(8168),o=(r(6540),r(5680));const a={title:"0.4 Changelogs"},l=void 0,c={unversionedId:"changelogs/index",id:"version-0.4/changelogs/index",title:"0.4 Changelogs",description:"* Fleet v0.4.1 (latest)",source:"@site/versioned_docs/version-0.4/changelogs/index.md",sourceDirName:"changelogs",slug:"/changelogs/",permalink:"/0.4/changelogs/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/changelogs/index.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"0.4 Changelogs"}},i={},s=[],p={toc:s},g="wrapper";function u(e){let{components:t,...r}=e;return(0,o.yg)(g,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.4/changelogs/changelogs/v0.4.1"},"Fleet v0.4.1")," (latest)")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/0.4/changelogs/changelogs/v0.4.0"},"Fleet v0.4.0")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f14b6af8.758a893a.js b/assets/js/f14b6af8.758a893a.js deleted file mode 100644 index 34c837c05..000000000 --- a/assets/js/f14b6af8.758a893a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9795],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,m=f["".concat(s,".").concat(d)]||f[d]||u[d]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.6/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.6/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.6/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.6/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.6/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -h, --help help for apply\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f14b6af8.d08a654f.js b/assets/js/f14b6af8.d08a654f.js new file mode 100644 index 000000000..35be3f665 --- /dev/null +++ b/assets/js/f14b6af8.d08a654f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9795],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>m});var r=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(n),d=l,m=f["".concat(s,".").concat(d)]||f[d]||u[d]||o;return n?r.createElement(m,a(a({ref:t},p),{},{components:n})):r.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(8168),l=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.6/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.6/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.6/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.6/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.6/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(f,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n -h, --help help for apply\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f1a2b4e4.5d390d40.js b/assets/js/f1a2b4e4.5d390d40.js new file mode 100644 index 000000000..caff0fe86 --- /dev/null +++ b/assets/js/f1a2b4e4.5d390d40.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2540],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.10/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.10/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.10/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/imagescan.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.10/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.10/bundle-add"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},'Semver will ignore pre-release versions (for example, 0.0.1-10) unless a pre-release version is explicitly used in the range definition.\nFor example, the "*" range will ignore pre-releases while ">= 0.0.1-10" will take them into account.')),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f1a2b4e4.b126cfcb.js b/assets/js/f1a2b4e4.b126cfcb.js deleted file mode 100644 index 51cdf74f6..000000000 --- a/assets/js/f1a2b4e4.b126cfcb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2540],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=a.createContext({}),c=function(e){var n=a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(l.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,u=p["".concat(l,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.10/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.10/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.10/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/imagescan.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.10/webhook"},next:{title:"Create a Bundle Resource",permalink:"/0.10/bundle-add"}},l={},c=[],m={toc:c},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order\n- policy:\n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver:\n range: "*"\n # can use ascending or descending order\n alphabetical:\n order: asc\n\n # specify images to scan\n image: "your.registry.com/repo/image"\n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret\n\n # Specify the scan interval\n interval: 5m\n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},'Semver will ignore pre-release versions (for example, 0.0.1-10) unless a pre-release version is explicitly used in the range definition.\nFor example, the "*" range will ignore pre-releases while ">= 0.0.1-10" will take them into account.')),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples\n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m\n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret\n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2761eee.06aad8bf.js b/assets/js/f2761eee.06aad8bf.js deleted file mode 100644 index d26848c20..000000000 --- a/assets/js/f2761eee.06aad8bf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8652],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),m=a,c=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"version-0.9/ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/versioned_docs/version-0.9/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.9/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-resources.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.9/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/0.9/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2761eee.d73a4ec7.js b/assets/js/f2761eee.d73a4ec7.js new file mode 100644 index 000000000..c9dfdcfcd --- /dev/null +++ b/assets/js/f2761eee.d73a4ec7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8652],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),m=a,c=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"version-0.9/ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/versioned_docs/version-0.9/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.9/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/ref-resources.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.9/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/0.9/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2839486.3231dd8e.js b/assets/js/f2839486.3231dd8e.js deleted file mode 100644 index 333edc8a9..000000000 --- a/assets/js/f2839486.3231dd8e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6793],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=c(a),p=l,g=u["".concat(s,".").concat(p)]||u[p]||h[p]||n;return a?r.createElement(g,i(i({ref:t},d),{},{components:a})):r.createElement(g,i({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,i=new Array(n);i[0]=p;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.8.2",date:"2024-02-22 09:30:48 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.8.2",id:"version-0.8/changelogs/changelogs/v0.8.2",title:"v0.8.2",description:"(rancherio-gh-m) released this 2024-02-22 0948 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.2.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.2",permalink:"/0.8/changelogs/changelogs/v0.8.2",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.2.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"v0.8.2",date:"2024-02-22 09:30:48 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.1",permalink:"/0.8/changelogs/changelogs/v0.8.1"},next:{title:"v0.8.3",permalink:"/0.8/changelogs/changelogs/v0.8.3"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-02-22 09:30:48 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add helm version to capabilities by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1919242055","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1820","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1820/hovercard",href:"https://github.com/rancher/fleet/pull/1820"},"#1820"))),(0,l.yg)("h3",null,"Performance"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Use index when listing BundleDeployments by Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1941729004","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1859","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1859/hovercard",href:"https://github.com/rancher/fleet/pull/1859"},"#1859")),(0,l.yg)("li",null,"Replace json-based implementation of DeepCopy on GenericMap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006641252","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1956","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1956/hovercard",href:"https://github.com/rancher/fleet/pull/1956"},"#1956")),(0,l.yg)("li",null,"Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2074725279","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2055","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2055/hovercard",href:"https://github.com/rancher/fleet/pull/2055"},"#2055"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Initialise cluster registration labels map if empty by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078587574","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2063","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2063/hovercard",href:"https://github.com/rancher/fleet/pull/2063"},"#2063"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump BCI images and Gitjob by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006696224","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1957","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1957/hovercard",href:"https://github.com/rancher/fleet/pull/1957"},"#1957")),(0,l.yg)("li",null,"OCI auth test changes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2008494976","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1963","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1963/hovercard",href:"https://github.com/rancher/fleet/pull/1963"},"#1963")),(0,l.yg)("li",null,"Remove s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2076167734","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2056","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2056/hovercard",href:"https://github.com/rancher/fleet/pull/2056"},"#2056")),(0,l.yg)("li",null,"Update CI for k8s 1.28 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2081748640","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2071","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2071/hovercard",href:"https://github.com/rancher/fleet/pull/2071"},"#2071")),(0,l.yg)("li",null,"Bump modules to k8s 0.27 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2085916428","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2083","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2083/hovercard",href:"https://github.com/rancher/fleet/pull/2083"},"#2083"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.1...v0.8.2"},(0,l.yg)("tt",null,"v0.8.1...v0.8.2"))),(0,l.yg)("h3",null,"Gitjob"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add azure devops webhook support by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2065877024","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/401","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/401/hovercard",href:"https://github.com/rancher/gitjob/pull/401"},"rancher/gitjob#401"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Gitjob Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/gitjob/compare/v0.1.76-security1...v0.8.2"},"rancher/gitjob@",(0,l.yg)("tt",null,"v0.1.76-security1...v0.8.2"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-crd-0.8.2.tgz"},"fleet-crd-0.8.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-agent-0.8.2.tgz"},"fleet-agent-0.8.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-0.8.2.tgz"},"fleet-0.8.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.2"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2839486.b903b332.js b/assets/js/f2839486.b903b332.js new file mode 100644 index 000000000..dab78752a --- /dev/null +++ b/assets/js/f2839486.b903b332.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6793],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=c(a),p=l,g=u["".concat(s,".").concat(p)]||u[p]||h[p]||n;return a?r.createElement(g,i(i({ref:t},d),{},{components:a})):r.createElement(g,i({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,i=new Array(n);i[0]=p;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>o,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"v0.8.2",date:"2024-02-22 09:30:48 +0000 UTC"},i=void 0,o={unversionedId:"changelogs/changelogs/v0.8.2",id:"version-0.8/changelogs/changelogs/v0.8.2",title:"v0.8.2",description:"(rancherio-gh-m) released this 2024-02-22 0948 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.2.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.2",permalink:"/0.8/changelogs/changelogs/v0.8.2",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.2.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"v0.8.2",date:"2024-02-22 09:30:48 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.1",permalink:"/0.8/changelogs/changelogs/v0.8.1"},next:{title:"v0.8.3",permalink:"/0.8/changelogs/changelogs/v0.8.3"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},u="wrapper";function h(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-02-22 09:30:48 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"Notes"),(0,l.yg)("h2",null,"Additions"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add helm version to capabilities by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/rancherbot/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/rancherbot"},"@rancherbot")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1919242055","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1820","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1820/hovercard",href:"https://github.com/rancher/fleet/pull/1820"},"#1820"))),(0,l.yg)("h3",null,"Performance"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Use index when listing BundleDeployments by Bundle by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1941729004","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1859","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1859/hovercard",href:"https://github.com/rancher/fleet/pull/1859"},"#1859")),(0,l.yg)("li",null,"Replace json-based implementation of DeepCopy on GenericMap by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006641252","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1956","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1956/hovercard",href:"https://github.com/rancher/fleet/pull/1956"},"#1956")),(0,l.yg)("li",null,"Use UniqueApplyForResourceVersion in Bundle and GitRepo GeneratingHandlers by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2074725279","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2055","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2055/hovercard",href:"https://github.com/rancher/fleet/pull/2055"},"#2055"))),(0,l.yg)("h2",null,"Bugfixes"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Initialise cluster registration labels map if empty by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/weyfonk/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/weyfonk"},"@weyfonk")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2078587574","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2063","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2063/hovercard",href:"https://github.com/rancher/fleet/pull/2063"},"#2063"))),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump BCI images and Gitjob by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2006696224","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1957","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1957/hovercard",href:"https://github.com/rancher/fleet/pull/1957"},"#1957")),(0,l.yg)("li",null,"OCI auth test changes by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2008494976","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/1963","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/1963/hovercard",href:"https://github.com/rancher/fleet/pull/1963"},"#1963")),(0,l.yg)("li",null,"Remove s390x by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/aruiz14/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/aruiz14"},"@aruiz14")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2076167734","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2056","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2056/hovercard",href:"https://github.com/rancher/fleet/pull/2056"},"#2056")),(0,l.yg)("li",null,"Update CI for k8s 1.28 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2081748640","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2071","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2071/hovercard",href:"https://github.com/rancher/fleet/pull/2071"},"#2071")),(0,l.yg)("li",null,"Bump modules to k8s 0.27 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/manno/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/manno"},"@manno")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2085916428","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2083","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2083/hovercard",href:"https://github.com/rancher/fleet/pull/2083"},"#2083"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.1...v0.8.2"},(0,l.yg)("tt",null,"v0.8.1...v0.8.2"))),(0,l.yg)("h3",null,"Gitjob"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Add azure devops webhook support by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/raulcabello/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/raulcabello"},"@raulcabello")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2065877024","data-permission-text":"Title is private","data-url":"https://github.com/rancher/gitjob/issues/401","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/gitjob/pull/401/hovercard",href:"https://github.com/rancher/gitjob/pull/401"},"rancher/gitjob#401"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Gitjob Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/gitjob/compare/v0.1.76-security1...v0.8.2"},"rancher/gitjob@",(0,l.yg)("tt",null,"v0.1.76-security1...v0.8.2"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-crd-0.8.2.tgz"},"fleet-crd-0.8.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-agent-0.8.2.tgz"},"fleet-agent-0.8.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-0.8.2.tgz"},"fleet-0.8.2.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.2/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.2"},"here"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f347fdc1.ec8272ca.js b/assets/js/f347fdc1.ec8272ca.js new file mode 100644 index 000000000..f9bf95048 --- /dev/null +++ b/assets/js/f347fdc1.ec8272ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1943],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,y=d["".concat(s,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(y,o(o({ref:t},p),{},{components:n})):a.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.8/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.8/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.8/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/bundle-add.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.8/imagescan"},next:{title:"fleet-agent",permalink:"/0.8/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f347fdc1.f06b09de.js b/assets/js/f347fdc1.f06b09de.js deleted file mode 100644 index 7963b8b94..000000000 --- a/assets/js/f347fdc1.f06b09de.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1943],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,y=d["".concat(s,".").concat(m)]||d[m]||u[m]||l;return n?a.createElement(y,o(o({ref:t},p),{},{components:n})):a.createElement(y,o({ref:t},p))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=n(8168),r=(n(6540),n(5680));const l={},o="Create a Bundle Resource",i={unversionedId:"bundle-add",id:"version-0.8/bundle-add",title:"Create a Bundle Resource",description:"Bundles are automatically created by Fleet when a GitRepo is created. In most cases Bundles should not be created",source:"@site/versioned_docs/version-0.8/bundle-add.md",sourceDirName:".",slug:"/bundle-add",permalink:"/0.8/bundle-add",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/bundle-add.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Image Scan to Update Container Image References",permalink:"/0.8/imagescan"},next:{title:"fleet-agent",permalink:"/0.8/cli/fleet-agent/"}},s={},c=[{value:"Limitations",id:"limitations",level:2},{value:"Convert a Helm Chart into a Bundle",id:"convert-a-helm-chart-into-a-bundle",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,a.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"create-a-bundle-resource"},"Create a Bundle Resource"),(0,r.yg)("p",null,"Bundles are automatically created by Fleet when a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," is created. In most cases ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundles")," should not be created\nmanually by the user. If you want to deploy resources from a git repository use a\n",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-add"},"GitRepo")," instead."),(0,r.yg)("p",null,"If you want to deploy resources without a git repository follow this guide to create a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle"),"."),(0,r.yg)("p",null,"When creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo")," Fleet will fetch the resources from a git repository, and add them to a Bundle.\nWhen creating a ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," resources need to be explicitly specified in the ",(0,r.yg)("inlineCode",{parentName:"p"},"Bundle")," Spec.\nResources can be compressed with gz. See ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher/blob/v2.7.3/pkg/controllers/provisioningv2/managedchart/managedchart.go#L149-L153"},"here"),"\nan example of how Rancher uses compression in go code."),(0,r.yg)("p",null,"If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in ",(0,r.yg)("inlineCode",{parentName:"p"},"GitRepo"),".\nSee ",(0,r.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/gitrepo-targets#defining-targets"},"Mapping to Downstream Clusters"),"."),(0,r.yg)("p",null,"The following example creates a nginx ",(0,r.yg)("inlineCode",{parentName:"p"},"Deployment")," in the local cluster:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: Bundle\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n # Any name can be used here\n name: my-bundle\n # For single cluster use fleet-local, otherwise use the namespace of\n # your choosing\n namespace: fleet-local\nspec:\n resources:\n # List of all resources that will be deployed\n - content: |\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: nginx-deployment\n labels:\n app: nginx\n spec:\n replicas: 3\n selector:\n matchLabels:\n app: nginx\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 name: nginx.yaml\n targets:\n - clusterName: local\n\n")),(0,r.yg)("h2",{id:"limitations"},"Limitations"),(0,r.yg)("p",null,"Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.repo")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"spec.helm.charts"))),(0,r.yg)("p",null,"You can't use a ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in resources, it is only used by the fleet-cli to create bundles."),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targetRestrictions")," field is not useful, as it is an allow list for targets specified in ",(0,r.yg)("inlineCode",{parentName:"p"},"spec.targets"),". It is not needed, since ",(0,r.yg)("inlineCode",{parentName:"p"},"targets")," are explicitly given in a bundle and an empty ",(0,r.yg)("inlineCode",{parentName:"p"},"targetRestrictions")," defaults to allow."),(0,r.yg)("h2",{id:"convert-a-helm-chart-into-a-bundle"},"Convert a Helm Chart into a Bundle"),(0,r.yg)("p",null,"You can use the Fleet CLI to convert a Helm chart into a bundle."),(0,r.yg)("p",null,'For example, you can download and convert the "external secrets" operator chart like this:'),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"cat > targets.yaml < app/fleet.yaml < eso-bundle.yaml\n\nkubectl apply -f eso-bundle.yaml\n")),(0,r.yg)("p",null,"Make sure you use a cluster selector in ",(0,r.yg)("inlineCode",{parentName:"p"},"targets.yaml"),", that matches all clusters you want to deploy to."),(0,r.yg)("p",null,"The blog post on ",(0,r.yg)("a",{parentName:"p",href:"https://www.suse.com/c/rancher_blog/fleet-multi-cluster-deployment-with-the-help-of-external-secrets/"},"Fleet: Multi-Cluster Deployment with the Help of External Secrets")," has more information."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f3d80b69.5c32913e.js b/assets/js/f3d80b69.54687dd5.js similarity index 51% rename from assets/js/f3d80b69.5c32913e.js rename to assets/js/f3d80b69.54687dd5.js index a2cde11cc..1a033e0bb 100644 --- a/assets/js/f3d80b69.5c32913e.js +++ b/assets/js/f3d80b69.54687dd5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7327],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>y});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=l.createContext({}),p=function(e){var t=l.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},d="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},u=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=p(n),u=r,y=d["".concat(c,".").concat(u)]||d[u]||f[u]||o;return n?l.createElement(y,a(a({ref:t},s),{},{components:n})):l.createElement(y,a({ref:t},s))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=u;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[d]="string"==typeof e?e:r,a[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet deploy"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_deploy",id:"version-0.10/cli/fleet-cli/fleet_deploy",title:"",description:"fleet deploy",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_deploy.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_deploy",permalink:"/0.10/cli/fleet-cli/fleet_deploy",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_deploy.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet deploy"},sidebar:"docs",previous:{title:"fleet cleanup",permalink:"/0.10/cli/fleet-cli/fleet_cleanup"},next:{title:"fleet target",permalink:"/0.10/cli/fleet-cli/fleet_target"}},c={},p=[{value:"fleet deploy",id:"fleet-deploy",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:p},d="wrapper";function f(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,l.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,"Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet deploy [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"}," -a, --agent-namespace string Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.\n -d, --dry-run Print the resources that would be deployed, but do not actually deploy them\n -h, --help help for deploy\n -i, --input-file string Location of the YAML file containing the content and the bundledeployment resource\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Set the default namespace. Deploy helm chart into this namespace.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7327],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>y});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=l.createContext({}),p=function(e){var t=l.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=p(e.components);return l.createElement(c.Provider,{value:t},e.children)},d="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},u=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=p(n),u=r,y=d["".concat(c,".").concat(u)]||d[u]||f[u]||o;return n?l.createElement(y,a(a({ref:t},s),{},{components:n})):l.createElement(y,a({ref:t},s))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=u;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[d]="string"==typeof e?e:r,a[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet deploy"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_deploy",id:"version-0.10/cli/fleet-cli/fleet_deploy",title:"",description:"fleet deploy",source:"@site/versioned_docs/version-0.10/cli/fleet-cli/fleet_deploy.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_deploy",permalink:"/0.10/cli/fleet-cli/fleet_deploy",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/cli/fleet-cli/fleet_deploy.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet deploy"},sidebar:"docs",previous:{title:"fleet cleanup",permalink:"/0.10/cli/fleet-cli/fleet_cleanup"},next:{title:"fleet target",permalink:"/0.10/cli/fleet-cli/fleet_target"}},c={},p=[{value:"fleet deploy",id:"fleet-deploy",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:p},d="wrapper";function f(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,l.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,"Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet deploy [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"}," -a, --agent-namespace string Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.\n -d, --dry-run Print the resources that would be deployed, but do not actually deploy them\n -h, --help help for deploy\n -i, --input-file string Location of the YAML file containing the content and the bundledeployment resource\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Set the default namespace. Deploy helm chart into this namespace.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4793a78.96d20daa.js b/assets/js/f4793a78.f8a4fde4.js similarity index 67% rename from assets/js/f4793a78.96d20daa.js rename to assets/js/f4793a78.f8a4fde4.js index 7663b0ad5..1460f5c40 100644 --- a/assets/js/f4793a78.96d20daa.js +++ b/assets/js/f4793a78.f8a4fde4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7148],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.6/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.6/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.6/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cluster-group.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.6/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.6/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7148],{5680:(e,t,r)=>{r.d(t,{xA:()=>i,yg:()=>d});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},i=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,i=l(e,["components","mdxType","originalType","parentName"]),p=u(r),g=a,d=p["".concat(c,".").concat(g)]||p[g]||m[g]||o;return r?n.createElement(d,s(s({ref:t},i),{},{components:r})):n.createElement(d,s({ref:t},i))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[p]="string"==typeof e?e:a,s[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(8168),a=(r(6540),r(5680));const o={},s="Create Cluster Groups",l={unversionedId:"cluster-group",id:"version-0.6/cluster-group",title:"Create Cluster Groups",description:"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.",source:"@site/versioned_docs/version-0.6/cluster-group.md",sourceDirName:".",slug:"/cluster-group",permalink:"/0.6/cluster-group",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/cluster-group.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Register Downstream Clusters",permalink:"/0.6/cluster-registration"},next:{title:"Setup Multi User",permalink:"/0.6/multi-user"}},c={},u=[],i={toc:u},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.yg)(p,(0,n.A)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"create-cluster-groups"},"Create Cluster Groups"),(0,a.yg)("p",null,"Clusters in a namespace can be put into a cluster group. A cluster group is essentially a named selector.\nThe only parameter for a cluster group is essentially the selector.\nWhen you get to a certain scale cluster groups become a more reasonable way to manage your clusters.\nCluster groups serve the purpose of giving aggregated\nstatus of the deployments and then also a simpler way to manage targets."),(0,a.yg)("p",null,"A cluster group is created by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," resource like below"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: ClusterGroup\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: production-group\n namespace: clusters\nspec:\n # This is the standard metav1.LabelSelector format to match clusters by labels\n selector:\n matchLabels:\n env: prod\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f531b716.1dc7b4fc.js b/assets/js/f531b716.1dc7b4fc.js new file mode 100644 index 000000000..559254d61 --- /dev/null +++ b/assets/js/f531b716.1dc7b4fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2148],{5680:(e,n,t)=>{t.d(n,{xA:()=>m,yg:()=>u});var a=t(6540);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),l=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=l(e.components);return a.createElement(c.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(t),d=r,u=p["".concat(c,".").concat(d)]||p[d]||g[d]||o;return t?a.createElement(u,i(i({ref:n},m),{},{components:t})):a.createElement(u,i({ref:n},m))}));function u(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(8168),r=(t(6540),t(5680));const o={},i="Using Image Scan to Update Container Image References",s={unversionedId:"imagescan",id:"version-0.6/imagescan",title:"Using Image Scan to Update Container Image References",description:"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,",source:"@site/versioned_docs/version-0.6/imagescan.md",sourceDirName:".",slug:"/imagescan",permalink:"/0.6/imagescan",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/imagescan.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Using Webhooks Instead of Polling",permalink:"/0.6/webhook"},next:{title:"fleet-agent",permalink:"/0.6/cli/fleet-agent/"}},c={},l=[],m={toc:l},p="wrapper";function g(e){let{components:n,...t}=e;return(0,r.yg)(p,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-image-scan-to-update-container-image-references"},"Using Image Scan to Update Container Image References"),(0,r.yg)("p",null,"Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository,\nwithout the need to manually update your manifests."),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"This feature is considered as experimental feature.")),(0,r.yg)("p",null,"Go to ",(0,r.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and add the following section."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'imageScans:\n# specify the policy to retrieve images, can be semver or alphabetical order \n- policy: \n # if range is specified, it will take the latest image according to semver order in the range\n # for more details on how to use semver, see https://github.com/Masterminds/semver\n semver: \n range: "*" \n # can use ascending or descending order\n alphabetical:\n order: asc \n\n # specify images to scan\n image: "your.registry.com/repo/image" \n\n # Specify the tag name, it has to be unique in the same bundle\n tagName: test-scan\n\n # specify secret to pull image if in private registry\n secretRef:\n name: dockerhub-secret \n\n # Specify the scan interval\n interval: 5m \n')),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can create multiple image scans in fleet.yaml.")),(0,r.yg)("p",null,"Go to your manifest files and update the field that you want to replace. For example:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: redis-slave\nspec:\n selector:\n matchLabels:\n app: redis\n role: slave\n tier: backend\n replicas: 2\n template:\n metadata:\n labels:\n app: redis\n role: slave\n tier: backend\n spec:\n containers:\n - name: slave\n image: : # {"$imagescan": "test-scan"}\n resources:\n requests:\n cpu: 100m\n memory: 100Mi\n ports:\n - containerPort: 6379\n')),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"There are multiple form of tagName you can reference. For example"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan"}'),": Use full image name(foo/bar:tag)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:name"}'),": Only use image name without tag(foo/bar)"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:tag"}'),": Only use image tag"),(0,r.yg)("p",{parentName:"admonition"},(0,r.yg)("inlineCode",{parentName:"p"},'{"$imagescan": "test-scan:digest"}'),": Use full image name with digest(foo/bar:",(0,r.yg)("a",{parentName:"p",href:"mailto:tag@sha256..."},"tag@sha256..."),")")),(0,r.yg)("p",null,"Create a GitRepo that includes your fleet.yaml"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-repo\n namespace: fleet-local\nspec:\n # change this to be your own repo\n repo: https://github.com/rancher/fleet-examples \n # define how long it will sync all the images and decide to apply change\n imageScanInterval: 5m \n # user must properly provide a secret that have write access to git repository\n clientSecretName: secret \n # specify the commit pattern\n imageScanCommit:\n authorName: foo\n authorEmail: foo@bar.com\n messageTemplate: "update image"\n')),(0,r.yg)("p",null,"Try pushing a new image tag, for example, ",(0,r.yg)("inlineCode",{parentName:"p"},":"),". Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml.\nOnce change is made into git repository, fleet will read through the change and deploy the change into your cluster."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f59af033.5ae364a3.js b/assets/js/f59af033.5ae364a3.js deleted file mode 100644 index 4b167821d..000000000 --- a/assets/js/f59af033.5ae364a3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3190],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.9/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/versioned_docs/version-0.9/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.9/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/webhook.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.9/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.9/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/f59af033.f0402606.js b/assets/js/f59af033.f0402606.js new file mode 100644 index 000000000..27025801e --- /dev/null +++ b/assets/js/f59af033.f0402606.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3190],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Using Webhooks Instead of Polling",l={unversionedId:"webhook",id:"version-0.9/webhook",title:"Using Webhooks Instead of Polling",description:"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).",source:"@site/versioned_docs/version-0.9/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.9/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/webhook.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs to Ignore Modified GitRepos",permalink:"/0.9/bundle-diffs"},next:{title:"Using Image Scan to Update Container Image References",permalink:"/0.9/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"using-webhooks-instead-of-polling"},"Using Webhooks Instead of Polling"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens)."),(0,r.yg)("p",null,"For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling."),(0,r.yg)("p",null,"Fleet currently supports Github, GitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/f63438e5.4f3a87ed.js b/assets/js/f63438e5.4f3a87ed.js new file mode 100644 index 000000000..276ff66f4 --- /dev/null +++ b/assets/js/f63438e5.4f3a87ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[2089],{5680:(e,t,o)=>{o.d(t,{xA:()=>u,yg:()=>h});var n=o(6540);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||a;return o?n.createElement(h,i(i({ref:t},u),{},{components:o})):n.createElement(h,i({ref:t},u))}));function h(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=g;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=o(8168),r=(o(6540),o(5680));const a={},i="Webhook",l={unversionedId:"webhook",id:"version-0.4/webhook",title:"Webhook",description:"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,",source:"@site/versioned_docs/version-0.4/webhook.md",sourceDirName:".",slug:"/webhook",permalink:"/0.4/webhook",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/webhook.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.4/bundle-diffs"},next:{title:"Image scan",permalink:"/0.4/imagescan"}},s={},c=[{value:"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.",id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service",level:3},{value:"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.",id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example",level:3},{value:"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.",id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system",level:3},{value:"4. Go to your git provider and test the connection. You should get a HTTP response code.",id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,n.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"webhook"},"Webhook"),(0,r.yg)("p",null,"By default, Fleet utilizes polling (default: 15 seconds) to pull from a Git repo.However, this can be configured to utilize a webhook instead.Fleet currently supports Github,\nGitLab, Bitbucket, Bitbucket Server and Gogs."),(0,r.yg)("h3",{id:"1-configure-the-webhook-service-fleet-uses-a-gitjob-service-to-handle-webhook-requests-create-an-ingress-that-points-to-the-gitjob-service"},"1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: webhook-ingress\n namespace: cattle-fleet-system\nspec:\n rules:\n - host: your.domain.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: gitjob\n port:\n number: 80\n")),(0,r.yg)("admonition",{type:"info"},(0,r.yg)("p",{parentName:"admonition"},"You can configure ",(0,r.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/#tls"},"TLS")," on ingress.")),(0,r.yg)("h3",{id:"2-go-to-your-webhook-provider-and-configure-the-webhook-callback-url-here-is-a-github-example"},"2. Go to your webhook provider and configure the webhook callback url. Here is a Github example."),(0,r.yg)("p",null,(0,r.yg)("img",{src:o(4068).A,width:"1830",height:"1563"})),(0,r.yg)("p",null,"Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default.\nIf your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the\nsecret, follow step 3."),(0,r.yg)("admonition",{type:"note"},(0,r.yg)("p",{parentName:"admonition"},"only application/json is supported due to the limitation of webhook library.")),(0,r.yg)("admonition",{type:"caution"},(0,r.yg)("p",{parentName:"admonition"},"If you configured the webhook the polling interval will be automatically adjusted to 1 hour.")),(0,r.yg)("h3",{id:"3-optional-configure-webhook-secret-the-secret-is-for-validating-webhook-payload-make-sure-to-put-it-in-a-k8s-secret-called-gitjob-webhook-in-cattle-fleet-system"},"3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called ",(0,r.yg)("inlineCode",{parentName:"h3"},"gitjob-webhook")," in ",(0,r.yg)("inlineCode",{parentName:"h3"},"cattle-fleet-system"),"."),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Provider"),(0,r.yg)("th",{parentName:"tr",align:null},"K8s Secret Key"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitHub"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"github"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"GitLab"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gitlab"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucket"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"BitBucketServer"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"bitbucket-server"))),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"Gogs"),(0,r.yg)("td",{parentName:"tr",align:null},(0,r.yg)("inlineCode",{parentName:"td"},"gogs"))))),(0,r.yg)("p",null,"For example, to create a secret containing a GitHub secret to validate the webhook payload, run:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue\n")),(0,r.yg)("h3",{id:"4-go-to-your-git-provider-and-test-the-connection-you-should-get-a-http-response-code"},"4. Go to your git provider and test the connection. You should get a HTTP response code."))}d.isMDXComponent=!0},4068:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/webhook-9c042ab211f1b5438bf70372e92ecdf7.png"}}]); \ No newline at end of file diff --git a/assets/js/f66ef323.51b039e4.js b/assets/js/f66ef323.51b039e4.js new file mode 100644 index 000000000..55e17c756 --- /dev/null +++ b/assets/js/f66ef323.51b039e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9980],{5680:(e,t,a)=>{a.d(t,{xA:()=>m,yg:()=>s});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var y=n.createContext({}),p=function(e){var t=n.useContext(y),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},m=function(e){var t=p(e.components);return n.createElement(y.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},N=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,y=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),u=p(a),N=l,s=u["".concat(y,".").concat(N)]||u[N]||d[N]||r;return a?n.createElement(s,g(g({ref:t},m),{},{components:a})):n.createElement(s,g({ref:t},m))}));function s(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=N;var i={};for(var y in t)hasOwnProperty.call(t,y)&&(i[y]=t[y]);i.originalType=e,i[u]="string"==typeof e?e:l,g[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>y,contentTitle:()=>g,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.6/ref-crds",title:"Custom Resources Spec",description:"* GitRepo",source:"@site/versioned_docs/version-0.6/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.6/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-crds.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.6/ref-configuration"},next:{title:"fleet.yaml",permalink:"/0.6/ref-fleet-yaml"}},y={},p=[{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"Bundle",id:"bundle",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"Content",id:"content",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4}],m={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,n.A)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus"))),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ResourcePerClusterState]","(#resourceperclusterstate)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for private helm repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of target this repo will deploy to"),(0,l.yg)("td",{parentName:"tr",align:null},"[][GitTarget]","(#gittarget)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when new image is scanned and write back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][GitRepoResource]","(#gitreporesource)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleRef]","(#bundleref)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][NonReadyStatus]","(#nonreadystatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ModifiedStatus]","(#modifiedstatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contain the actual resources from the git repo which will be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleResource]","(#bundleresource)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleTarget]","(#bundletarget)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions restrict which clusters the bundle will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleTargetRestriction]","(#bundletargetrestriction)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleRef]","(#bundleref)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][PartitionStatus]","(#partitionstatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ResourceKey]","(#resourcekey)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][NonReadyResource]","(#nonreadyresource)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][Operation]","(#operation)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ComparePatch]","(#comparepatch)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[][ValuesFrom]","(#valuesfrom)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ModifiedStatus]","(#modifiedstatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][NonReadyStatus]","(#nonreadystatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][Partition]","(#partition)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f66ef323.7afde34f.js b/assets/js/f66ef323.7afde34f.js deleted file mode 100644 index de6bd8481..000000000 --- a/assets/js/f66ef323.7afde34f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[9980],{5680:(e,t,a)=>{a.d(t,{xA:()=>m,yg:()=>s});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function g(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var y=n.createContext({}),p=function(e){var t=n.useContext(y),a=t;return e&&(a="function"==typeof e?e(t):g(g({},t),e)),a},m=function(e){var t=p(e.components);return n.createElement(y.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},N=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,r=e.originalType,y=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),u=p(a),N=l,s=u["".concat(y,".").concat(N)]||u[N]||d[N]||r;return a?n.createElement(s,g(g({ref:t},m),{},{components:a})):n.createElement(s,g({ref:t},m))}));function s(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=a.length,g=new Array(r);g[0]=N;var i={};for(var y in t)hasOwnProperty.call(t,y)&&(i[y]=t[y]);i.originalType=e,i[u]="string"==typeof e?e:l,g[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>y,contentTitle:()=>g,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const r={},g="Custom Resources Spec",i={unversionedId:"ref-crds",id:"version-0.6/ref-crds",title:"Custom Resources Spec",description:"* GitRepo",source:"@site/versioned_docs/version-0.6/ref-crds.md",sourceDirName:".",slug:"/ref-crds",permalink:"/0.6/ref-crds",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/ref-crds.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.6/ref-configuration"},next:{title:"fleet.yaml",permalink:"/0.6/ref-fleet-yaml"}},y={},p=[{value:"GitRepo",id:"gitrepo",level:4},{value:"GitRepoDisplay",id:"gitrepodisplay",level:4},{value:"GitRepoResource",id:"gitreporesource",level:4},{value:"GitRepoResourceCounts",id:"gitreporesourcecounts",level:4},{value:"GitRepoRestriction",id:"gitreporestriction",level:4},{value:"GitRepoSpec",id:"gitrepospec",level:4},{value:"GitRepoStatus",id:"gitrepostatus",level:4},{value:"GitTarget",id:"gittarget",level:4},{value:"ResourcePerClusterState",id:"resourceperclusterstate",level:4},{value:"Bundle",id:"bundle",level:4},{value:"BundleDeployment",id:"bundledeployment",level:4},{value:"BundleDeploymentDisplay",id:"bundledeploymentdisplay",level:4},{value:"BundleDeploymentOptions",id:"bundledeploymentoptions",level:4},{value:"BundleDeploymentSpec",id:"bundledeploymentspec",level:4},{value:"BundleDeploymentStatus",id:"bundledeploymentstatus",level:4},{value:"BundleDisplay",id:"bundledisplay",level:4},{value:"BundleNamespaceMapping",id:"bundlenamespacemapping",level:4},{value:"BundleRef",id:"bundleref",level:4},{value:"BundleResource",id:"bundleresource",level:4},{value:"BundleSpec",id:"bundlespec",level:4},{value:"BundleStatus",id:"bundlestatus",level:4},{value:"BundleSummary",id:"bundlesummary",level:4},{value:"BundleTarget",id:"bundletarget",level:4},{value:"BundleTargetRestriction",id:"bundletargetrestriction",level:4},{value:"ComparePatch",id:"comparepatch",level:4},{value:"ConfigMapKeySelector",id:"configmapkeyselector",level:4},{value:"Content",id:"content",level:4},{value:"DiffOptions",id:"diffoptions",level:4},{value:"HelmOptions",id:"helmoptions",level:4},{value:"KustomizeOptions",id:"kustomizeoptions",level:4},{value:"LocalObjectReference",id:"localobjectreference",level:4},{value:"ModifiedStatus",id:"modifiedstatus",level:4},{value:"NonReadyResource",id:"nonreadyresource",level:4},{value:"NonReadyStatus",id:"nonreadystatus",level:4},{value:"Operation",id:"operation",level:4},{value:"Partition",id:"partition",level:4},{value:"PartitionStatus",id:"partitionstatus",level:4},{value:"ResourceKey",id:"resourcekey",level:4},{value:"RolloutStrategy",id:"rolloutstrategy",level:4},{value:"SecretKeySelector",id:"secretkeyselector",level:4},{value:"ValuesFrom",id:"valuesfrom",level:4},{value:"YAMLOptions",id:"yamloptions",level:4},{value:"AlphabeticalPolicy",id:"alphabeticalpolicy",level:4},{value:"CommitSpec",id:"commitspec",level:4},{value:"ImagePolicyChoice",id:"imagepolicychoice",level:4},{value:"ImageScan",id:"imagescan",level:4},{value:"ImageScanSpec",id:"imagescanspec",level:4},{value:"ImageScanStatus",id:"imagescanstatus",level:4},{value:"SemVerPolicy",id:"semverpolicy",level:4},{value:"AgentStatus",id:"agentstatus",level:4},{value:"Cluster",id:"cluster",level:4},{value:"ClusterDisplay",id:"clusterdisplay",level:4},{value:"ClusterGroup",id:"clustergroup",level:4},{value:"ClusterGroupDisplay",id:"clustergroupdisplay",level:4},{value:"ClusterGroupSpec",id:"clustergroupspec",level:4},{value:"ClusterGroupStatus",id:"clustergroupstatus",level:4},{value:"ClusterRegistration",id:"clusterregistration",level:4},{value:"ClusterRegistrationSpec",id:"clusterregistrationspec",level:4},{value:"ClusterRegistrationStatus",id:"clusterregistrationstatus",level:4},{value:"ClusterRegistrationToken",id:"clusterregistrationtoken",level:4},{value:"ClusterRegistrationTokenSpec",id:"clusterregistrationtokenspec",level:4},{value:"ClusterRegistrationTokenStatus",id:"clusterregistrationtokenstatus",level:4},{value:"ClusterSpec",id:"clusterspec",level:4},{value:"ClusterStatus",id:"clusterstatus",level:4}],m={toc:p},u="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(u,(0,n.A)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"custom-resources-spec"},"Custom Resources Spec"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepo"},"GitRepo")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporestriction"},"GitRepoRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundle"},"Bundle")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeployment"},"BundleDeployment")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlenamespacemapping"},"BundleNamespaceMapping")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#content"},"Content")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescan"},"ImageScan")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#cluster"},"Cluster")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroup"},"ClusterGroup")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistration"},"ClusterRegistration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtoken"},"ClusterRegistrationToken"))),(0,l.yg)("h1",{id:"sub-resources"},"Sub Resources"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesource"},"GitRepoResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#gittarget"},"GitTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourceperclusterstate"},"ResourcePerClusterState")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleref"},"BundleRef")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundleresource"},"BundleResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletarget"},"BundleTarget")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#bundletargetrestriction"},"BundleTargetRestriction")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#comparepatch"},"ComparePatch")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#localobjectreference"},"LocalObjectReference")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#modifiedstatus"},"ModifiedStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadyresource"},"NonReadyResource")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#nonreadystatus"},"NonReadyStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#operation"},"Operation")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partition"},"Partition")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#partitionstatus"},"PartitionStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#resourcekey"},"ResourceKey")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#valuesfrom"},"ValuesFrom")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#commitspec"},"CommitSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"#clusterstatus"},"ClusterStatus"))),(0,l.yg)("h4",{id:"gitrepo"},"GitRepo"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepospec"},"GitRepoSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepostatus"},"GitRepoStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepodisplay"},"GitRepoDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundleDeployments"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesource"},"GitRepoResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"type"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"id"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"incompleteState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"perClusterState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ResourcePerClusterState]","(#resourceperclusterstate)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporesourcecounts"},"GitRepoResourceCounts"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"orphaned"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unknown"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitreporestriction"},"GitRepoRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultServiceAccount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedServiceAccounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedRepoPatterns"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultClientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedClientSecretNames"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"allowedTargetNamespaces"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepospec"},"GitRepoSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is a URL to a git repo to clone and index"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"branch"),(0,l.yg)("td",{parentName:"tr",align:null},"Branch The git branch to follow"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"revision"),(0,l.yg)("td",{parentName:"tr",align:null},"Revision A specific commit or tag to operate on"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"Ensure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},'ClientSecretName is the client secret to be used to connect to the repo It is expected the secret be of type \\"kubernetes.io/basic-auth\\" or \\"kubernetes.io/ssh-auth\\".'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmSecretName"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmSecretName contains the auth secret for private helm repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helmRepoURLRegex"),(0,l.yg)("td",{parentName:"tr",align:null},"HelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"caBundle"),(0,l.yg)("td",{parentName:"tr",align:null},"CABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate."),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"insecureSkipTLSVerify"),(0,l.yg)("td",{parentName:"tr",align:null},"InsecureSkipTLSverify will use insecure HTTPS to clone the repo."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paths"),(0,l.yg)("td",{parentName:"tr",align:null},"Paths is the directories relative to the git repo root that contain resources to be applied. Path globbing is support, for example ",'[\\"charts/*\\"]',' will match all folders as a subdirectory of charts/ If empty, \\"/\\" is the default'),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused this cause changes in Git to not be propagated down to the clusters but instead mark resources as OutOfSync"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount used in the downstream cluster for deployment"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets is a list of target this repo will deploy to"),(0,l.yg)("td",{parentName:"tr",align:null},"[][GitTarget]","(#gittarget)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pollingInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"PollingInterval is how often to check git for new updates"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"Increment this number to force a redeployment of contents from Git"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanInterval"),(0,l.yg)("td",{parentName:"tr",align:null},"ImageScanInterval is the interval of syncing scanned images and writing back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"imageScanCommit"),(0,l.yg)("td",{parentName:"tr",align:null},"Commit specifies how to commit to the git repo when new image is scanned and write back to git repo"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#commitspec"},"CommitSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources specifies if the resources created must be kept after deleting the GitRepo"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gitrepostatus"},"GitRepoStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"commit"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitJobStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitrepodisplay"},"GitRepoDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][GitRepoResource]","(#gitreporesource)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceErrors"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSyncedImageScanTime"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"gittarget"},"GitTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourceperclusterstate"},"ResourcePerClusterState"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"error"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"transitioning"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterId"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundle"},"Bundle"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlespec"},"BundleSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlestatus"},"BundleStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeployment"},"BundleDeployment"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentspec"},"BundleDeploymentSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentstatus"},"BundleDeploymentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentdisplay"},"BundleDeploymentDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deployed"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"monitored"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentoptions"},"BundleDeploymentOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"defaultNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"DefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kustomize"),(0,l.yg)("td",{parentName:"tr",align:null},"Kustomize options for the deployment, like the dir containing the kustomization.yaml file."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#kustomizeoptions"},"KustomizeOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"helm"),(0,l.yg)("td",{parentName:"tr",align:null},"Helm options for the deployment, like the chart name, repo and values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#helmoptions"},"HelmOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"serviceAccount"),(0,l.yg)("td",{parentName:"tr",align:null},"ServiceAccount which will be used to perform this deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"forceSyncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"ForceSyncGeneration is used to force a redeployment"),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"yaml"),(0,l.yg)("td",{parentName:"tr",align:null},"YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#yamloptions"},"YAMLOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"diff"),(0,l.yg)("td",{parentName:"tr",align:null},"Diff can be used to ignore the modified state of objects which are amended at runtime."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#diffoptions"},"DiffOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"keepResources"),(0,l.yg)("td",{parentName:"tr",align:null},"KeepResources can be used to keep the deployed resources when removing the bundle"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentspec"},"BundleDeploymentSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"stagedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"options"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"deploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleRef]","(#bundleref)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledeploymentstatus"},"BundleDeploymentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"appliedDeploymentID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"release"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonModified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][NonReadyStatus]","(#nonreadystatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ModifiedStatus]","(#modifiedstatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentdisplay"},"BundleDeploymentDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"syncGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundledisplay"},"BundleDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlenamespacemapping"},"BundleNamespaceMapping"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespaceSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleref"},"BundleRef"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundleresource"},"BundleResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"encoding"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlespec"},"BundleSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"rolloutStrategy"),(0,l.yg)("td",{parentName:"tr",align:null},"RolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#rolloutstrategy"},"RolloutStrategy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resources"),(0,l.yg)("td",{parentName:"tr",align:null},"Resources contain the actual resources from the git repo which will be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleResource]","(#bundleresource)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targets"),(0,l.yg)("td",{parentName:"tr",align:null},"Targets refer to the clusters which will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleTarget]","(#bundletarget)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"targetRestrictions"),(0,l.yg)("td",{parentName:"tr",align:null},"TargetRestrictions restrict which clusters the bundle will be deployed to."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleTargetRestriction]","(#bundletargetrestriction)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dependsOn"),(0,l.yg)("td",{parentName:"tr",align:null},"DependsOn refers to the bundles which must be ready before this bundle can be deployed."),(0,l.yg)("td",{parentName:"tr",align:null},"[][BundleRef]","(#bundleref)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlestatus"},"BundleStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"newlyCreated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxNew"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][PartitionStatus]","(#partitionstatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledisplay"},"BundleDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceKey"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ResourceKey]","(#resourcekey)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundlesummary"},"BundleSummary"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"notReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"errApplied"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"outOfSync"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modified"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ready"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"pending"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReady"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyResources"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][NonReadyResource]","(#nonreadyresource)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletarget"},"BundleTarget"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"BundleDeploymentOptions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundledeploymentoptions"},"BundleDeploymentOptions")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"bundletargetrestriction"},"BundleTargetRestriction"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"comparepatch"},"ComparePatch"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"operations"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][Operation]","(#operation)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"jsonPointers"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"configmapkeyselector"},"ConfigMapKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"content"},"Content"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"content"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]byte"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"diffoptions"},"DiffOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"comparePatches"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ComparePatch]","(#comparepatch)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"helmoptions"},"HelmOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"chart"),(0,l.yg)("td",{parentName:"tr",align:null},"Chart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"repo"),(0,l.yg)("td",{parentName:"tr",align:null},"Repo is the name of the HTTPS helm repo to download the chart from."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"releaseName"),(0,l.yg)("td",{parentName:"tr",align:null},"ReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"version"),(0,l.yg)("td",{parentName:"tr",align:null},"Version of the chart to download"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"TimeoutSeconds is the time to wait for Helm operations."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"values"),(0,l.yg)("td",{parentName:"tr",align:null},"Values passed to Helm. It is possible to specify the keys and values as go template strings."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFrom"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFrom loads the values from configmaps and secrets."),(0,l.yg)("td",{parentName:"tr",align:null},"[][ValuesFrom]","(#valuesfrom)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"force"),(0,l.yg)("td",{parentName:"tr",align:null},"Force allows to override immutable resources. This could be dangerous."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"takeOwnership"),(0,l.yg)("td",{parentName:"tr",align:null},"TakeOwnership makes helm skip the check for its own annotations"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxHistory"),(0,l.yg)("td",{parentName:"tr",align:null},"MaxHistory limits the maximum number of revisions saved per release by Helm."),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"valuesFiles"),(0,l.yg)("td",{parentName:"tr",align:null},"ValuesFiles is a list of files to load values from."),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"waitForJobs"),(0,l.yg)("td",{parentName:"tr",align:null},"WaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSeconds"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"atomic"),(0,l.yg)("td",{parentName:"tr",align:null},"Atomic sets the --atomic flag when Helm is performing an upgrade"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"disablePreProcess"),(0,l.yg)("td",{parentName:"tr",align:null},"DisablePreProcess disables template processing in values"),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"kustomizeoptions"},"KustomizeOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"dir"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"localobjectreference"},"LocalObjectReference"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"modifiedstatus"},"ModifiedStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"missing"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"delete"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"patch"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadyresource"},"NonReadyResource"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"bundleState"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"BundleState"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"message"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"modifiedStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][ModifiedStatus]","(#modifiedstatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyStatus"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][NonReadyStatus]","(#nonreadystatus)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"nonreadystatus"},"NonReadyStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"uid"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"types.UID"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"summary.Summary"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"operation"},"Operation"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"op"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"path"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"value"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partition"},"Partition"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroup"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterGroupSelector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"partitionstatus"},"PartitionStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"count"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"unavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"resourcekey"},"ResourceKey"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kind"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"apiVersion"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"name"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"rolloutstrategy"},"RolloutStrategy"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailable"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"maxUnavailablePartitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"autoPartitionSize"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*intstr.IntOrString"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"partitions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[][Partition]","(#partition)"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"secretkeyselector"},"SecretKeySelector"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"key"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"valuesfrom"},"ValuesFrom"),(0,l.yg)("p",null,"Define helm values that can come from configmap, secret or external. Credit: ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439"},"https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"configMapKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a config map with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#configmapkeyselector"},"ConfigMapKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretKeyRef"),(0,l.yg)("td",{parentName:"tr",align:null},"The reference to a secret with release values."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#secretkeyselector"},"SecretKeySelector")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"yamloptions"},"YAMLOptions"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"overlays"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"alphabeticalpolicy"},"AlphabeticalPolicy"),(0,l.yg)("p",null,"AlphabeticalPolicy specifies a alphabetical ordering policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"order"),(0,l.yg)("td",{parentName:"tr",align:null},"Order specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"commitspec"},"CommitSpec"),(0,l.yg)("p",null,"CommitSpec specifies how to commit changes to the git repository"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorName"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorName gives the name to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"authorEmail"),(0,l.yg)("td",{parentName:"tr",align:null},"AuthorEmail gives the email to provide when making a commit"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"messageTemplate"),(0,l.yg)("td",{parentName:"tr",align:null},"MessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagepolicychoice"},"ImagePolicyChoice"),(0,l.yg)("p",null,"ImagePolicyChoice is a union of all the types of policy that can be supplied."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"semver"),(0,l.yg)("td",{parentName:"tr",align:null},"SemVer gives a semantic version range to check against the tags available."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#semverpolicy"},"SemVerPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"alphabetical"),(0,l.yg)("td",{parentName:"tr",align:null},"Alphabetical set of rules to use for alphabetical ordering of the tags."),(0,l.yg)("td",{parentName:"tr",align:null},"*",(0,l.yg)("a",{parentName:"td",href:"#alphabeticalpolicy"},"AlphabeticalPolicy")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescan"},"ImageScan"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanspec"},"ImageScanSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagescanstatus"},"ImageScanStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanspec"},"ImageScanSpec"),(0,l.yg)("p",null,"API is taken from ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/fluxcd/image-reflector-controller"},"https://github.com/fluxcd/image-reflector-controller")),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"tagName"),(0,l.yg)("td",{parentName:"tr",align:null},"TagName is the tag ref that needs to be put in manifest to replace fields"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"gitrepoName"),(0,l.yg)("td",{parentName:"tr",align:null},"GitRepo reference name"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"image"),(0,l.yg)("td",{parentName:"tr",align:null},"Image is the name of the image repository"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"interval"),(0,l.yg)("td",{parentName:"tr",align:null},"Interval is the length of time to wait between scans of the image repository."),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretRef"),(0,l.yg)("td",{parentName:"tr",align:null},"SecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with ",(0,l.yg)("inlineCode",{parentName:"td"},"kubectl create secret docker-registry"),", or the equivalent."),(0,l.yg)("td",{parentName:"tr",align:null},"*corev1.LocalObjectReference"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"suspend"),(0,l.yg)("td",{parentName:"tr",align:null},"This flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"policy"),(0,l.yg)("td",{parentName:"tr",align:null},"Policy gives the particulars of the policy to be followed in selecting the most recent image"),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#imagepolicychoice"},"ImagePolicyChoice")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"imagescanstatus"},"ImageScanStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastScanTime"),(0,l.yg)("td",{parentName:"tr",align:null},"LastScanTime is the last time image was scanned"),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestImage"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestTag"),(0,l.yg)("td",{parentName:"tr",align:null},"Latest tag is the latest tag filtered by the policy"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"latestDigest"),(0,l.yg)("td",{parentName:"tr",align:null},"LatestDigest is the digest of latest tag"),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"observedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"canonicalImageName"),(0,l.yg)("td",{parentName:"tr",align:null},"CanonicalName is the name of the image repository with all the implied bits made explicit; e.g., ",(0,l.yg)("inlineCode",{parentName:"td"},"docker.io/library/alpine")," rather than ",(0,l.yg)("inlineCode",{parentName:"td"},"alpine"),"."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"semverpolicy"},"SemVerPolicy"),(0,l.yg)("p",null,"SemVerPolicy specifies a semantic version policy."),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"range"),(0,l.yg)("td",{parentName:"tr",align:null},"Range gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"agentstatus"},"AgentStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"lastSeen"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodeNames"),(0,l.yg)("td",{parentName:"tr",align:null},"At most 3 nodes"),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"cluster"},"Cluster"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterspec"},"ClusterSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterstatus"},"ClusterStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterdisplay"},"ClusterDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyNodes"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"sampleNode"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroup"},"ClusterGroup"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupspec"},"ClusterGroupSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupstatus"},"ClusterGroupStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"true")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupdisplay"},"ClusterGroupDisplay"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyBundles"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"state"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupspec"},"ClusterGroupSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"selector"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.LabelSelector"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clustergroupstatus"},"ClusterGroupStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusterCount"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"nonReadyClusters"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clustergroupdisplay"},"ClusterGroupDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistration"},"ClusterRegistration"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationspec"},"ClusterRegistrationSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationstatus"},"ClusterRegistrationStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationspec"},"ClusterRegistrationSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientRandom"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterLabels"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"map","[string]","string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationstatus"},"ClusterRegistrationStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clusterName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"granted"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtoken"},"ClusterRegistrationToken"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"metadata"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"metav1.ObjectMeta"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"spec"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"status"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenspec"},"ClusterRegistrationTokenSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"ttl"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Duration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterregistrationtokenstatus"},"ClusterRegistrationTokenStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"expires"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*metav1.Time"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"secretName"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterspec"},"ClusterSpec"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"paused"),(0,l.yg)("td",{parentName:"tr",align:null},"Paused if set to true, will stop any BundleDeployments from being updated."),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"clientID"),(0,l.yg)("td",{parentName:"tr",align:null},"ClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"kubeConfigSecret"),(0,l.yg)("td",{parentName:"tr",align:null},"KubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"redeployAgentGeneration"),(0,l.yg)("td",{parentName:"tr",align:null},"RedeployAgentGeneration can be used to force redeploying the agent."),(0,l.yg)("td",{parentName:"tr",align:null},"int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVars"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentEnvVars are extra environment variables to be added to the agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.EnvVar"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespace"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentNamespace defaults to the system namespace, e.g. cattle-fleet-system."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"privateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null},"PrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config."),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"templateValues"),(0,l.yg)("td",{parentName:"tr",align:null},"TemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating."),(0,l.yg)("td",{parentName:"tr",align:null},"*GenericMap"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentTolerations"),(0,l.yg)("td",{parentName:"tr",align:null},"AgentTolerations defines an extra set of Tolerations to be added to the Agent deployment."),(0,l.yg)("td",{parentName:"tr",align:null},"[]v1.Toleration"),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")),(0,l.yg)("h4",{id:"clusterstatus"},"ClusterStatus"),(0,l.yg)("table",null,(0,l.yg)("thead",{parentName:"table"},(0,l.yg)("tr",{parentName:"thead"},(0,l.yg)("th",{parentName:"tr",align:null},"Field"),(0,l.yg)("th",{parentName:"tr",align:null},"Description"),(0,l.yg)("th",{parentName:"tr",align:null},"Scheme"),(0,l.yg)("th",{parentName:"tr",align:null},"Required"))),(0,l.yg)("tbody",{parentName:"table"},(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"conditions"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"[]genericcondition.GenericCondition"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"namespace"),(0,l.yg)("td",{parentName:"tr",align:null},'Namespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \\"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\\"'),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"summary"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#bundlesummary"},"BundleSummary")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"resourceCounts"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#gitreporesourcecounts"},"GitRepoResourceCounts")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"readyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"desiredReadyGitRepos"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"int"),(0,l.yg)("td",{parentName:"tr",align:null},"true")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentEnvVarsHash"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentPrivateRepoURL"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"string"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentDeployedGeneration"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"*int64"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agentNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"cattleNamespaceMigrated"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},"bool"),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"display"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#clusterdisplay"},"ClusterDisplay")),(0,l.yg)("td",{parentName:"tr",align:null},"false")),(0,l.yg)("tr",{parentName:"tbody"},(0,l.yg)("td",{parentName:"tr",align:null},"agent"),(0,l.yg)("td",{parentName:"tr",align:null}),(0,l.yg)("td",{parentName:"tr",align:null},(0,l.yg)("a",{parentName:"td",href:"#agentstatus"},"AgentStatus")),(0,l.yg)("td",{parentName:"tr",align:null},"false")))),(0,l.yg)("p",null,(0,l.yg)("a",{parentName:"p",href:"#custom-resources"},"Back to Custom Resources")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f6748474.b64af5f3.js b/assets/js/f6748474.b64af5f3.js new file mode 100644 index 000000000..7ace4eb40 --- /dev/null +++ b/assets/js/f6748474.b64af5f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3747],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>m});var n=r(6540);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),d=i,m=p["".concat(l,".").concat(d)]||p[d]||g[d]||a;return r?n.createElement(m,o(o({ref:t},u),{},{components:r})):n.createElement(m,o({ref:t},u))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:i,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(8168),i=(r(6540),r(5680));const a={},o="Overview",s={unversionedId:"cluster-overview",id:"version-0.4/cluster-overview",title:"Overview",description:"There are two specific styles to registering clusters. These styles will be referred",source:"@site/versioned_docs/version-0.4/cluster-overview.md",sourceDirName:".",slug:"/cluster-overview",permalink:"/0.4/cluster-overview",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/cluster-overview.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Examples",permalink:"/0.4/examples"},next:{title:"Cluster Registration Tokens",permalink:"/0.4/cluster-tokens"}},l={},c=[{value:"Agent Initiated Registration",id:"agent-initiated-registration",level:2},{value:"Manager Initiated Registration",id:"manager-initiated-registration",level:2}],u={toc:c},p="wrapper";function g(e){let{components:t,...r}=e;return(0,i.yg)(p,(0,n.A)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.yg)("h1",{id:"overview"},"Overview"),(0,i.yg)("p",null,"There are two specific styles to registering clusters. These styles will be referred\nto as ",(0,i.yg)("strong",{parentName:"p"},"agent initiated")," and ",(0,i.yg)("strong",{parentName:"p"},"manager initiated")," registration. Typically one would\ngo with the agent initiated registration but there are specific use cases in which\nmanager initiated is a better workflow."),(0,i.yg)("h2",{id:"agent-initiated-registration"},"Agent Initiated Registration"),(0,i.yg)("p",null,"Agent initiated refers to a pattern in which the downstream cluster installs an agent with a\n",(0,i.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token")," and optionally a client ID. The cluster\nagent will then make a API request to the Fleet manager and initiate the registration process. Using\nthis process the Manager will never make an outbound API request to the downstream clusters and will thus\nnever need to have direct network access. The downstream cluster only needs to make outbound HTTPS\ncalls to the manager."),(0,i.yg)("h2",{id:"manager-initiated-registration"},"Manager Initiated Registration"),(0,i.yg)("p",null,"Manager initiated registration is a process in which you register an existing Kubernetes cluster\nwith the Fleet manager and the Fleet manager will make an API call to the downstream cluster to\ndeploy the agent. This style can place additional network access requirements because the Fleet\nmanager must be able to communicate with the downstream cluster API server for the registration process.\nAfter the cluster is registered there is no further need for the manager to contact the downstream\ncluster API. This style is more compatible if you wish to manage the creation of all your Kubernetes\nclusters through GitOps using something like ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/kubernetes-sigs/cluster-api"},"cluster-api"),"\nor ",(0,i.yg)("a",{parentName:"p",href:"https://github.com/rancher/rancher"},"Rancher"),"."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f78aef8c.9115d56d.js b/assets/js/f78aef8c.2cbdbda0.js similarity index 51% rename from assets/js/f78aef8c.9115d56d.js rename to assets/js/f78aef8c.2cbdbda0.js index ec282028e..498b80594 100644 --- a/assets/js/f78aef8c.9115d56d.js +++ b/assets/js/f78aef8c.2cbdbda0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3685],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>y});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=l.createContext({}),p=function(e){var t=l.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=p(e.components);return l.createElement(i.Provider,{value:t},e.children)},d="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},u=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=p(n),u=r,y=d["".concat(i,".").concat(u)]||d[u]||f[u]||o;return n?l.createElement(y,a(a({ref:t},s),{},{components:n})):l.createElement(y,a({ref:t},s))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=u;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[d]="string"==typeof e?e:r,a[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet deploy"},a=void 0,c={unversionedId:"cli/fleet-cli/fleet_deploy",id:"cli/fleet-cli/fleet_deploy",title:"",description:"fleet deploy",source:"@site/docs/cli/fleet-cli/fleet_deploy.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_deploy",permalink:"/cli/fleet-cli/fleet_deploy",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_deploy.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet deploy"},sidebar:"docs",previous:{title:"fleet cleanup",permalink:"/cli/fleet-cli/fleet_cleanup"},next:{title:"fleet target",permalink:"/cli/fleet-cli/fleet_target"}},i={},p=[{value:"fleet deploy",id:"fleet-deploy",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:p},d="wrapper";function f(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,l.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,"Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet deploy [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"}," -a, --agent-namespace string Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.\n -d, --dry-run Print the resources that would be deployed, but do not actually deploy them\n -h, --help help for deploy\n -i, --input-file string Location of the YAML file containing the content and the bundledeployment resource\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Set the default namespace. Deploy helm chart into this namespace.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[3685],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>y});var l=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=l.createContext({}),p=function(e){var t=l.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=p(e.components);return l.createElement(i.Provider,{value:t},e.children)},d="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},u=l.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=p(n),u=r,y=d["".concat(i,".").concat(u)]||d[u]||f[u]||o;return n?l.createElement(y,a(a({ref:t},s),{},{components:n})):l.createElement(y,a({ref:t},s))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=u;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[d]="string"==typeof e?e:r,a[1]=c;for(var p=2;p{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var l=n(8168),r=(n(6540),n(5680));const o={title:"",sidebar_label:"fleet deploy"},a=void 0,c={unversionedId:"cli/fleet-cli/fleet_deploy",id:"cli/fleet-cli/fleet_deploy",title:"",description:"fleet deploy",source:"@site/docs/cli/fleet-cli/fleet_deploy.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_deploy",permalink:"/cli/fleet-cli/fleet_deploy",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/cli/fleet-cli/fleet_deploy.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet deploy"},sidebar:"docs",previous:{title:"fleet cleanup",permalink:"/cli/fleet-cli/fleet_cleanup"},next:{title:"fleet target",permalink:"/cli/fleet-cli/fleet_target"}},i={},p=[{value:"fleet deploy",id:"fleet-deploy",level:2},{value:"Options",id:"options",level:3},{value:"SEE ALSO",id:"see-also",level:3}],s={toc:p},d="wrapper";function f(e){let{components:t,...n}=e;return(0,r.yg)(d,(0,l.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h2",{id:"fleet-deploy"},"fleet deploy"),(0,r.yg)("p",null,"Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"fleet deploy [flags]\n")),(0,r.yg)("h3",{id:"options"},"Options"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"}," -a, --agent-namespace string Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.\n -d, --dry-run Print the resources that would be deployed, but do not actually deploy them\n -h, --help help for deploy\n -i, --input-file string Location of the YAML file containing the content and the bundledeployment resource\n --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.\n -n, --namespace string Set the default namespace. Deploy helm chart into this namespace.\n --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)\n --zap-encoder encoder Zap log encoding (one of 'json' or 'console')\n --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity\n --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').\n --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.\n")),(0,r.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f7c88408.21d9faa2.js b/assets/js/f7c88408.21d9faa2.js new file mode 100644 index 000000000..5fe4a7f4c --- /dev/null +++ b/assets/js/f7c88408.21d9faa2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8095],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.6/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.6/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.6/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/multi-user.md",tags:[],version:"0.6",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.6/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.6/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.6/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.6/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/f7c88408.4e93ee69.js b/assets/js/f7c88408.4e93ee69.js deleted file mode 100644 index 190d67869..000000000 --- a/assets/js/f7c88408.4e93ee69.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8095],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,s=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?r.createElement(g,l(l({ref:t},p),{},{components:n})):r.createElement(g,l({ref:t},p))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var s=n.length,l=new Array(s);l[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const s={},l="Setup Multi User",o={unversionedId:"multi-user",id:"version-0.6/multi-user",title:"Setup Multi User",description:"Fleet uses Kubernetes RBAC where possible.",source:"@site/versioned_docs/version-0.6/multi-user.md",sourceDirName:".",slug:"/multi-user",permalink:"/0.6/multi-user",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.6/multi-user.md",tags:[],version:"0.6",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Create Cluster Groups",permalink:"/0.6/cluster-group"},next:{title:"Create a GitRepo Resource",permalink:"/0.6/gitrepo-add"}},i={},c=[{value:"Example User",id:"example-user",level:2},{value:"Allow Access to Clusters",id:"allow-access-to-clusters",level:2},{value:"Restricting Access to Downstream Clusters",id:"restricting-access-to-downstream-clusters",level:2},{value:"An Example GitRepo Resource",id:"an-example-gitrepo-resource",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...s}=e;return(0,a.yg)(u,(0,r.A)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"setup-multi-user"},"Setup Multi User"),(0,a.yg)("p",null,"Fleet uses Kubernetes RBAC where possible."),(0,a.yg)("p",null,"One addition on top of RBAC is the ",(0,a.yg)("a",{parentName:"p",href:"/0.6/namespaces#restricting-gitrepos"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepoRestriction"))," resource, which can be used to control GitRepo resources in a namespace."),(0,a.yg)("p",null,"A multi-user fleet setup looks like this:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"tenants don't share namespaces, each tenant has one or more namespaces on the\nupstream cluster, where they can create GitRepo resources"),(0,a.yg)("li",{parentName:"ul"},"tenants can't deploy cluster wide resources and are limited to a set of\nnamespaces on downstream clusters"),(0,a.yg)("li",{parentName:"ul"},"clusters are in a separate namespace")),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Shared Clusters",src:n(4394).A,width:"2488",height:"1769"})),(0,a.yg)("admonition",{title:"important information",type:"warning"},(0,a.yg)("p",{parentName:"admonition"},"The isolation of tenants is not complete and relies on Kubernetes RBAC to be\nset up correctly. Without manual setup from an operator tenants can still\ndeploy cluster wide resources. Even with the available Fleet restrictions,\nusers are only restricted to namespaces, but namespaces don't provide much\nisolation on their own. E.g. they can still consume as many resources as they\nlike."),(0,a.yg)("p",{parentName:"admonition"},"However, the existing Fleet restrictions allow users to share clusters, and\ndeploy resources without conflicts.")),(0,a.yg)("h2",{id:"example-user"},"Example User"),(0,a.yg)("p",null,"This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create serviceaccount fleetuser\nkubectl create namespace project1\nkubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser\n")),(0,a.yg)("p",null,"If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io\nkubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\nkubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser\n")),(0,a.yg)("p",null,"This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces."),(0,a.yg)("h2",{id:"allow-access-to-clusters"},"Allow Access to Clusters"),(0,a.yg)("p",null,"This assumes all GitRepos created by 'fleetuser' have the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label. Different labels could be used, to select different cluster namespaces."),(0,a.yg)("p",null,"In each of the user's namespaces, as an admin create a ",(0,a.yg)("a",{parentName:"p",href:"/0.6/namespaces#cross-namespace-deployments"},(0,a.yg)("inlineCode",{parentName:"a"},"BundleNamespaceMapping")),"."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: mapping\n namespace: project1\n\n# Bundles to match by label.\n# The labels are defined in the fleet.yaml # labels field or from the\n# GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n team: one\n # or target one repo\n #fleet.cattle.io/repo-name: simpleapp\n\n# Namespaces, containing clusters, to match by label\nnamespaceSelector:\n matchLabels:\n kubernetes.io/metadata.name: fleet-default\n # the label is on the namespace\n #workspace: prod\n")),(0,a.yg)("p",null,"The ",(0,a.yg)("a",{parentName:"p",href:"/0.6/gitrepo-targets"},(0,a.yg)("inlineCode",{parentName:"a"},"target")," section")," in the GitRepo resource can be used to deploy only to a subset of the matched clusters."),(0,a.yg)("h2",{id:"restricting-access-to-downstream-clusters"},"Restricting Access to Downstream Clusters"),(0,a.yg)("p",null,"Admins can further restrict tenants by creating a ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," in each of their namespaces."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: project1\n\nallowedTargetNamespaces:\n - project1simpleapp\n")),(0,a.yg)("p",null,"This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace."),(0,a.yg)("h2",{id:"an-example-gitrepo-resource"},"An Example GitRepo Resource"),(0,a.yg)("p",null,"A GitRepo resource created by a tenant, without admin access could look like this:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: simpleapp\n namespace: project1\n labels:\n team: one\n\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - bundle-diffs\n\n targetNamespace: project1simpleapp\n\n # do not match the upstream/local cluster, won't work\n targets:\n - name: dev\n clusterSelector:\n matchLabels:\n env: dev\n")),(0,a.yg)("p",null,"This includes the ",(0,a.yg)("inlineCode",{parentName:"p"},"team: one")," label and and the required ",(0,a.yg)("inlineCode",{parentName:"p"},"targetNamespace"),"."),(0,a.yg)("p",null,"Together with the previous ",(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," it would target all clusters with a ",(0,a.yg)("inlineCode",{parentName:"p"},"env: dev")," label in the 'fleet-default' namespace."),(0,a.yg)("admonition",{type:"note"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," do not work with local clusters, so make sure not to target them.")))}m.isMDXComponent=!0},4394:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetSharedClusters-b68f6c53b43cbb795e4d81cda9ebc2bc.svg"}}]); \ No newline at end of file diff --git a/assets/js/f7cf1511.6acd508c.js b/assets/js/f7cf1511.6acd508c.js new file mode 100644 index 000000000..19ecf7ae5 --- /dev/null +++ b/assets/js/f7cf1511.6acd508c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7637],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>u});var o=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=c(n),g=a,u=d["".concat(s,".").concat(g)]||d[g]||h[g]||l;return n?o.createElement(u,r(r({ref:t},p),{},{components:n})):o.createElement(u,r({ref:t},p))}));function u(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,r=new Array(l);r[0]=g;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:a,r[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var o=n(8168),a=(n(6540),n(5680));const l={},r="Troubleshooting",i={unversionedId:"troubleshooting",id:"version-0.5/troubleshooting",title:"Troubleshooting",description:"This section contains commands and tips to troubleshoot Fleet.",source:"@site/versioned_docs/version-0.5/troubleshooting.md",sourceDirName:".",slug:"/troubleshooting",permalink:"/0.5/troubleshooting",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/troubleshooting.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster and Bundle state",permalink:"/0.5/cluster-bundles-state"},next:{title:"Advanced Users",permalink:"/0.5/advanced-users"}},s={},c=[{value:"How Do I...",id:"how-do-i",level:2},{value:"Fetch the log from fleet-controller?",id:"fetch-the-log-from-fleet-controller",level:3},{value:"Fetch the log from the fleet-agent?",id:"fetch-the-log-from-the-fleet-agent",level:3},{value:"Fetch detailed error logs from GitRepos and Bundles?",id:"fetch-detailed-error-logs-from-gitrepos-and-bundles",level:3},{value:"Check a chart rendering error in Kustomize?",id:"check-a-chart-rendering-error-in-kustomize",level:3},{value:"Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?",id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml",level:3},{value:"Check the status of the fleet-controller?",id:"check-the-status-of-the-fleet-controller",level:3},{value:"Enable debug logging for fleet-controller and fleet-agent?",id:"enable-debug-logging-for-fleet-controller-and-fleet-agent",level:3},{value:"Additional Solutions for Other Fleet Issues",id:"additional-solutions-for-other-fleet-issues",level:2},{value:"Naming conventions for CRDs",id:"naming-conventions-for-crds",level:3},{value:"HTTP secrets in Github",id:"http-secrets-in-github",level:3},{value:"Fleet fails with bad response code: 403",id:"fleet-fails-with-bad-response-code-403",level:3},{value:"Helm chart repo: certificate signed by unknown authority",id:"helm-chart-repo-certificate-signed-by-unknown-authority",level:3},{value:"Fleet deployment stuck in modified state",id:"fleet-deployment-stuck-in-modified-state",level:3},{value:"GitRepo or Bundle stuck in modified state",id:"gitrepo-or-bundle-stuck-in-modified-state",level:3},{value:"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state",id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state",level:3},{value:"What if the cluster is unavailable, or is in a WaitCheckIn state?",id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state",level:3},{value:"GitRepo complains with gzip: invalid header",id:"gitrepo-complains-with-gzip-invalid-header",level:3},{value:"Migrate the local cluster to the Fleet default cluster workspace?",id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace",level:3}],p={toc:c},d="wrapper";function h(e){let{components:t,...n}=e;return(0,a.yg)(d,(0,o.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,a.yg)("p",null,"This section contains commands and tips to troubleshoot Fleet."),(0,a.yg)("h2",{id:"how-do-i"},(0,a.yg)("strong",{parentName:"h2"},"How Do I...")),(0,a.yg)("h3",{id:"fetch-the-log-from-fleet-controller"},"Fetch the log from ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"In the local management cluster where the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is deployed, run the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -l app=fleet-controller -n cattle-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-the-log-from-the-fleet-agent"},"Fetch the log from the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Go to each downstream cluster and run the following command for the local cluster with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"# Downstream cluster\n$ kubectl logs -l app=fleet-agent -n cattle-fleet-system\n# Local cluster\n$ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system\n")),(0,a.yg)("h3",{id:"fetch-detailed-error-logs-from-gitrepos-and-bundles"},"Fetch detailed error logs from ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepos")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundles"),"?"),(0,a.yg)("p",null,"Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"For more information about the bundle, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"bundle"),", and the YAML mode will be enabled. "),(0,a.yg)("li",{parentName:"ul"},"For more information about the GitRepo, click on ",(0,a.yg)("inlineCode",{parentName:"li"},"GitRepo"),", then click on ",(0,a.yg)("inlineCode",{parentName:"li"},"View Yaml")," in the upper right of the screen. After viewing the YAML, check ",(0,a.yg)("inlineCode",{parentName:"li"},"status.conditions"),"; a detailed error message should be displayed here."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-controller")," for synching errors."),(0,a.yg)("li",{parentName:"ul"},"Check the ",(0,a.yg)("inlineCode",{parentName:"li"},"fleet-agent")," log in the downstream cluster if you encounter issues when deploying the bundle.")),(0,a.yg)("h3",{id:"check-a-chart-rendering-error-in-kustomize"},"Check a chart rendering error in ",(0,a.yg)("inlineCode",{parentName:"h3"},"Kustomize"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/troubleshooting#fetch-the-log-from-fleet-controller"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-controller")," logs")," and the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/troubleshooting#fetch-the-log-from-the-fleet-agent"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet-agent")," logs"),"."),(0,a.yg)("h3",{id:"check-errors-about-watching-or-checking-out-the-gitrepo-or-about-the-downloaded-helm-repo-in-fleetyaml"},"Check errors about watching or checking out the ",(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo"),", or about the downloaded Helm repo in ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet.yaml"),"?"),(0,a.yg)("p",null,"Check the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob-controller")," logs using the following command with your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitjob")," pod name filled in:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system\n")),(0,a.yg)("p",null,"Note that there are two containers inside the pod: the ",(0,a.yg)("inlineCode",{parentName:"p"},"step-git-source")," container that clones the git repo, and the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet")," container that applies bundles based on the git repo. "),(0,a.yg)("p",null,"The pods will usually have images named ",(0,a.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," with the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepo")," name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific ",(0,a.yg)("inlineCode",{parentName:"p"},"gitRepoName")," pod name and namespace:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},"$ kubectl logs -f $gitRepoName-pod-name -n namespace\n")),(0,a.yg)("h3",{id:"check-the-status-of-the-fleet-controller"},"Check the status of the ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller"),"?"),(0,a.yg)("p",null,"You can check the status of the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," pods by running the commands below:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,a.yg)("h3",{id:"enable-debug-logging-for-fleet-controller-and-fleet-agent"},"Enable debug logging for ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-controller")," and ",(0,a.yg)("inlineCode",{parentName:"h3"},"fleet-agent"),"?"),(0,a.yg)("p",null,"Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Go to the ",(0,a.yg)("strong",{parentName:"li"},"Dashboard"),", then click on the ",(0,a.yg)("strong",{parentName:"li"},"local cluster")," in the left navigation menu "),(0,a.yg)("li",{parentName:"ul"},"Select ",(0,a.yg)("strong",{parentName:"li"},"Apps & Marketplace"),", then ",(0,a.yg)("strong",{parentName:"li"},"Installed Apps")," from the dropdown "),(0,a.yg)("li",{parentName:"ul"},"From there, you will upgrade the Fleet chart with the value ",(0,a.yg)("inlineCode",{parentName:"li"},"debug=true"),". You can also set ",(0,a.yg)("inlineCode",{parentName:"li"},"debugLevel=5")," if desired.")),(0,a.yg)("h2",{id:"additional-solutions-for-other-fleet-issues"},(0,a.yg)("strong",{parentName:"h2"},"Additional Solutions for Other Fleet Issues")),(0,a.yg)("h3",{id:"naming-conventions-for-crds"},"Naming conventions for CRDs"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"For CRD terms like ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepos"),", you must reference the full CRD name. For example, the cluster CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"cluster.fleet.cattle.io"),", and the gitrepo CRD's complete name is ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo.fleet.cattle.io"),".")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"Bundles"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$gitrepoName-$path")," in the same workspace/namespace where the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," was created. Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$path")," is the path directory in the git repository that contains the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle")," (",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml"),").")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("inlineCode",{parentName:"p"},"BundleDeployments"),", which are created from the ",(0,a.yg)("inlineCode",{parentName:"p"},"bundle"),", follow the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"$bundleName-$clusterName")," in the namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"clusters-$workspace-$cluster-$generateHash"),". Note that ",(0,a.yg)("inlineCode",{parentName:"p"},"$clusterName")," is the cluster to which the bundle will be deployed."))),(0,a.yg)("h3",{id:"http-secrets-in-github"},"HTTP secrets in Github"),(0,a.yg)("p",null,"When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:"),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},"Create a ",(0,a.yg)("a",{parentName:"li",href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"},"personal access token")," in Github."),(0,a.yg)("li",{parentName:"ol"},"In Rancher, create an HTTP ",(0,a.yg)("a",{parentName:"li",href:"https://rancher.com/docs/rancher/v2.6/en/k8s-in-rancher/secrets/"},"secret")," with your Github username."),(0,a.yg)("li",{parentName:"ol"},"Use your token as the secret.")),(0,a.yg)("h3",{id:"fleet-fails-with-bad-response-code-403"},"Fleet fails with bad response code: 403"),(0,a.yg)("p",null,"If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your ",(0,a.yg)("a",{parentName:"p",href:"/0.5/gitrepo-structure"},(0,a.yg)("inlineCode",{parentName:"a"},"fleet.yaml")),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"\n')),(0,a.yg)("p",null,"Perform the following steps to assess:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully"),(0,a.yg)("li",{parentName:"ul"},"Check that your credentials for the git repo are valid")),(0,a.yg)("h3",{id:"helm-chart-repo-certificate-signed-by-unknown-authority"},"Helm chart repo: certificate signed by unknown authority"),(0,a.yg)("p",null,"If your GitJob returns the error below, you may have added the wrong certificate chain:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre"},'time="2021-11-11T05:55:08Z" level=fatal msg="Get \\"https://helm.intra/virtual-helm/index.yaml\\": x509: certificate signed by unknown authority" \n')),(0,a.yg)("p",null,"Please verify your certificate with the following command:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-bash"},"context=playground-local\nkubectl get secret -n fleet-default helm-repo -o jsonpath=\"{['data']['cacerts']}\" --context $context | base64 -d | openssl x509 -text -noout\nCertificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71\n Signature Algorithm: sha512WithRSAEncryption\n Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3\n...\n\n")),(0,a.yg)("h3",{id:"fleet-deployment-stuck-in-modified-state"},"Fleet deployment stuck in modified state"),(0,a.yg)("p",null,'When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.'),(0,a.yg)("p",null,"To ignore the modified flag for the differences between the Helm install generated by ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," and the resource in your cluster, add a ",(0,a.yg)("inlineCode",{parentName:"p"},"diff.comparePatches")," to the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," for your Deployment, as shown in this example:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'defaultNamespace: \nhelm: \n releaseName: \n repo: \n chart: \ndiff: \n comparePatches: \n - apiVersion: apps/v1\n kind: Deployment\n operations:\n - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}\n jsonPointers: # jsonPointers allows to ignore diffs at certain json path\n - "/spec/template/spec/priorityClassName"\n - "/spec/template/spec/tolerations" \n')),(0,a.yg)("p",null,"To determine which operations should be removed, observe the logs from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-agent")," on the target cluster. You should see entries similar to the following:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-text"},'level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\\"spec\\":{\\"template\\":{\\"spec\\":{\\"hostNetwork\\":false}}}}"\n')),(0,a.yg)("p",null,"Based on the above log, you can add the following entry to remove the operation:"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-json"},'{"op":"remove", "path":"/spec/template/spec/hostNetwork"}\n')),(0,a.yg)("h3",{id:"gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"h3"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"h3"},"Bundle")," stuck in modified state"),(0,a.yg)("p",null,(0,a.yg)("strong",{parentName:"p"},"Modified")," means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository."),(0,a.yg)("ol",null,(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"Check the ",(0,a.yg)("a",{parentName:"p",href:"/0.5/bundle-diffs"},"bundle diffs documentation")," for more information. ")),(0,a.yg)("li",{parentName:"ol"},(0,a.yg)("p",{parentName:"li"},"You can also force update the ",(0,a.yg)("inlineCode",{parentName:"p"},"gitrepo")," to perform a manual resync. Select ",(0,a.yg)("strong",{parentName:"p"},"GitRepo")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update"),"."))),(0,a.yg)("h3",{id:"bundle-has-a-horizontal-pod-autoscaler-hpa-in-modified-state"},"Bundle has a Horizontal Pod Autoscaler (HPA) in modified state"),(0,a.yg)("p",null,"For bundles with an HPA, the expected state is ",(0,a.yg)("inlineCode",{parentName:"p"},"Modified"),", as the bundle contains fields that differ from the state of the Bundle at deployment - usually ",(0,a.yg)("inlineCode",{parentName:"p"},"ReplicaSet"),"."),(0,a.yg)("p",null,"You must define a patch in the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," to ignore this field according to ",(0,a.yg)("a",{parentName:"p",href:"#gitrepo-or-bundle-stuck-in-modified-state"},(0,a.yg)("inlineCode",{parentName:"a"},"GitRepo")," or ",(0,a.yg)("inlineCode",{parentName:"a"},"Bundle")," stuck in modified state"),"."),(0,a.yg)("p",null,"Here is an example of such a patch for the deployment ",(0,a.yg)("inlineCode",{parentName:"p"},"nginx")," in namespace ",(0,a.yg)("inlineCode",{parentName:"p"},"default"),":"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: nginx\n namespace: default\n operations:\n - {"op": "remove", "path": "/spec/replicas"}\n')),(0,a.yg)("h3",{id:"what-if-the-cluster-is-unavailable-or-is-in-a-waitcheckin-state"},"What if the cluster is unavailable, or is in a ",(0,a.yg)("inlineCode",{parentName:"h3"},"WaitCheckIn")," state?"),(0,a.yg)("p",null,"You will need to re-import and restart the registration process: Select ",(0,a.yg)("strong",{parentName:"p"},"Cluster")," on the left navigation bar, then select ",(0,a.yg)("strong",{parentName:"p"},"Force Update")),(0,a.yg)("admonition",{type:"caution"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"WaitCheckIn status for Rancher v2.5"),":\nThe cluster will show in ",(0,a.yg)("inlineCode",{parentName:"p"},"WaitCheckIn")," status because the ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-controller")," is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the ",(0,a.yg)("a",{parentName:"p",href:"https://rancher.com/docs/rancher/v2.5/en/installation/other-installation-methods/behind-proxy/install-rancher/#install-rancher"},"Rancher docs"),".")),(0,a.yg)("h3",{id:"gitrepo-complains-with-gzip-invalid-header"},"GitRepo complains with ",(0,a.yg)("inlineCode",{parentName:"h3"},"gzip: invalid header")),(0,a.yg)("p",null,"When you see an error like the one below ..."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-sh"},"Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header\n")),(0,a.yg)("p",null,"... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content."),(0,a.yg)("h3",{id:"migrate-the-local-cluster-to-the-fleet-default-cluster-workspace"},"Migrate the local cluster to the Fleet default cluster workspace?"),(0,a.yg)("p",null,"Users can create new workspaces and move clusters across workspaces.\nIt's currently not possible to move the local cluster from ",(0,a.yg)("inlineCode",{parentName:"p"},"fleet-local")," to another workspace."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f8113afe.c16ff6d2.js b/assets/js/f8113afe.c16ff6d2.js deleted file mode 100644 index 4ef3c4d71..000000000 --- a/assets/js/f8113afe.c16ff6d2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5400],{7858:(e,t,l)=>{l.d(t,{e:()=>s});const s={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5290:(e,t,l)=>{l.r(t),l.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var s=l(8168),n=(l(6540),l(5680)),a=l(7858),r=l(2355);const i={},o="Single Cluster Install",c={unversionedId:"single-cluster-install",id:"version-0.5/single-cluster-install",title:"Single Cluster Install",description:"In this use case you have only one cluster. The cluster will run both the Fleet",source:"@site/versioned_docs/version-0.5/single-cluster-install.md",sourceDirName:".",slug:"/single-cluster-install",permalink:"/0.5/single-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/single-cluster-install.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation",permalink:"/0.5/installation"},next:{title:"Multi Cluster Install",permalink:"/0.5/multi-cluster-install"}},u={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"Install",id:"install",level:2}],g={toc:d},h="wrapper";function p(e){let{components:t,...i}=e;return(0,n.yg)(h,(0,s.A)({},g,i,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"single-cluster-install"},"Single Cluster Install"),(0,n.yg)("p",null,(0,n.yg)("img",{src:l(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"In this use case you have only one cluster. The cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,n.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,n.yg)("h3",{id:"helm-3"},"Helm 3"),(0,n.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,n.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,n.yg)("p",null,"macOS"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,n.yg)("p",null,"Windows"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,n.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,n.yg)("p",null,"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the\nsingle cluster use case you will install Fleet to the cluster which you intend to manage with GitOps.\nAny Kubernetes community supported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,n.yg)("h2",{id:"install"},"Install"),(0,n.yg)("p",null,"Install the following two Helm charts."),(0,n.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",a.e["v0.5"].fleetCRD),(0,n.yg)("p",null,"Second install the Fleet controllers."),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",a.e["v0.5"].fleet),(0,n.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,n.yg)("p",null,"You can now ",(0,n.yg)("a",{parentName:"p",href:"/0.5/gitrepo-add"},"register some git repos")," in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."))}p.isMDXComponent=!0},2614:(e,t,l)=>{l.d(t,{A:()=>s});const s=l.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/f8113afe.d31e74b0.js b/assets/js/f8113afe.d31e74b0.js new file mode 100644 index 000000000..ebe881173 --- /dev/null +++ b/assets/js/f8113afe.d31e74b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5400],{7858:(e,t,l)=>{l.d(t,{e:()=>s});const s={"v0.5":{fleet:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-0.5.3.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-agent-0.5.3.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.5.3/fleet-crd-0.5.3.tgz"},"v0.6":{fleet:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-0.6.0.tgz",fleetAgent:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-agent-0.6.0.tgz",fleetCRD:"https://github.com/rancher/fleet/releases/download/v0.6.0/fleet-crd-0.6.0.tgz"},next:{kubernetes:"1.20.5"}}},5290:(e,t,l)=>{l.r(t),l.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var s=l(8168),n=(l(6540),l(5680)),a=l(7858),r=l(2355);const i={},o="Single Cluster Install",c={unversionedId:"single-cluster-install",id:"version-0.5/single-cluster-install",title:"Single Cluster Install",description:"In this use case you have only one cluster. The cluster will run both the Fleet",source:"@site/versioned_docs/version-0.5/single-cluster-install.md",sourceDirName:".",slug:"/single-cluster-install",permalink:"/0.5/single-cluster-install",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/single-cluster-install.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Installation",permalink:"/0.5/installation"},next:{title:"Multi Cluster Install",permalink:"/0.5/multi-cluster-install"}},u={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Helm 3",id:"helm-3",level:3},{value:"Kubernetes",id:"kubernetes",level:3},{value:"Install",id:"install",level:2}],g={toc:d},h="wrapper";function p(e){let{components:t,...i}=e;return(0,n.yg)(h,(0,s.A)({},g,i,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"single-cluster-install"},"Single Cluster Install"),(0,n.yg)("p",null,(0,n.yg)("img",{src:l(2614).A,width:"520",height:"279"})),(0,n.yg)("p",null,"In this use case you have only one cluster. The cluster will run both the Fleet\nmanager and the Fleet agent. The cluster will communicate with Git server to\ndeploy resources to this local cluster. This is the simplest setup and very\nuseful for dev/test and small scale setups. This use case is supported as a valid\nuse case for production."),(0,n.yg)("h2",{id:"prerequisites"},"Prerequisites"),(0,n.yg)("h3",{id:"helm-3"},"Helm 3"),(0,n.yg)("p",null,"Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and is\nfairly straight forward. To install the Helm 3 CLI follow the\n",(0,n.yg)("a",{parentName:"p",href:"https://helm.sh/docs/intro/install/"},"official install instructions"),". The TL;DR is"),(0,n.yg)("p",null,"macOS"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"brew install helm\n")),(0,n.yg)("p",null,"Windows"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"choco install kubernetes-helm\n")),(0,n.yg)("h3",{id:"kubernetes"},"Kubernetes"),(0,n.yg)("p",null,"Fleet is a controller running on a Kubernetes cluster so an existing cluster is required. For the\nsingle cluster use case you will install Fleet to the cluster which you intend to manage with GitOps.\nAny Kubernetes community supported version of Kubernetes will work, in practice this means 1.15 or greater."),(0,n.yg)("h2",{id:"install"},"Install"),(0,n.yg)("p",null,"Install the following two Helm charts."),(0,n.yg)("p",null,"First install the Fleet CustomResourcesDefintions."),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet-crd"," ",a.e["v0.5"].fleetCRD),(0,n.yg)("p",null,"Second install the Fleet controllers."),(0,n.yg)(r.A,{language:"bash",mdxType:"CodeBlock"},"helm -n cattle-fleet-system install --create-namespace --wait \\\n fleet"," ",a.e["v0.5"].fleet),(0,n.yg)("p",null,"Fleet should be ready to use now for single cluster. You can check the status of the Fleet controller pods by\nrunning the below commands."),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n cattle-fleet-system logs -l app=fleet-controller\nkubectl -n cattle-fleet-system get pods -l app=fleet-controller\n")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre"},"NAME READY STATUS RESTARTS AGE\nfleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s\n")),(0,n.yg)("p",null,"You can now ",(0,n.yg)("a",{parentName:"p",href:"/0.5/gitrepo-add"},"register some git repos")," in the ",(0,n.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace to start deploying Kubernetes resources."))}p.isMDXComponent=!0},2614:(e,t,l)=>{l.d(t,{A:()=>s});const s=l.p+"assets/images/single-cluster-72ee1a61547953f123dd741c02cd2017.png"}}]); \ No newline at end of file diff --git a/assets/js/f8909550.6c92d6f4.js b/assets/js/f8909550.6c92d6f4.js deleted file mode 100644 index f717cccaf..000000000 --- a/assets/js/f8909550.6c92d6f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[107],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>y});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=n.createContext({}),p=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=p(e.components);return n.createElement(o.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(a),u=l,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||s;return a?n.createElement(y,r(r({ref:t},c),{},{components:a})):n.createElement(y,r({ref:t},c))}));function y(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,r=new Array(s);r[0]=u;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[m]="string"==typeof e?e:l,r[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const s={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.4/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.4/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.4/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/namespaces.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Groups",permalink:"/0.4/cluster-group"},next:{title:"Adding a GitRepo",permalink:"/0.4/gitrepo-add"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local",id:"fleet-local",level:3},{value:"cattle-fleet-system",id:"cattle-fleet-system",level:3},{value:"cattle-fleet-clusters-system",id:"cattle-fleet-clusters-system",level:3},{value:"Cluster namespaces",id:"cluster-namespaces",level:3},{value:"Cross namespace deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2}],c={toc:p},m="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"namespaces"},"Namespaces"),(0,l.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,l.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,l.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,l.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,l.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,l.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,l.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,l.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,l.yg)("h3",{id:"fleet-local"},"fleet-local"),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,l.yg)("p",null,"When fleet is installed the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,l.yg)("h3",{id:"cattle-fleet-system"},"cattle-fleet-system"),(0,l.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,l.yg)("h3",{id:"cattle-fleet-clusters-system"},"cattle-fleet-clusters-system"),(0,l.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,l.yg)("h3",{id:"cluster-namespaces"},"Cluster namespaces"),(0,l.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces have are named in the form ",(0,l.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,l.yg)("h2",{id:"cross-namespace-deployments"},"Cross namespace deployments"),(0,l.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,l.yg)("p",null,"If you are creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,l.yg)("p",null,"A ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,l.yg)("p",null,"If the ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,l.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,l.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,l.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,l.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,l.yg)("p",null,"A namespace can contain multiple ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,l.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,l.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f8909550.d641e0c4.js b/assets/js/f8909550.d641e0c4.js new file mode 100644 index 000000000..4b84ef9b3 --- /dev/null +++ b/assets/js/f8909550.d641e0c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[107],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>y});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=n.createContext({}),p=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=p(e.components);return n.createElement(o.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(a),u=l,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||s;return a?n.createElement(y,r(r({ref:t},c),{},{components:a})):n.createElement(y,r({ref:t},c))}));function y(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,r=new Array(s);r[0]=u;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[m]="string"==typeof e?e:l,r[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const s={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.4/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.4/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.4/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/namespaces.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Groups",permalink:"/0.4/cluster-group"},next:{title:"Adding a GitRepo",permalink:"/0.4/gitrepo-add"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local",id:"fleet-local",level:3},{value:"cattle-fleet-system",id:"cattle-fleet-system",level:3},{value:"cattle-fleet-clusters-system",id:"cattle-fleet-clusters-system",level:3},{value:"Cluster namespaces",id:"cluster-namespaces",level:3},{value:"Cross namespace deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2}],c={toc:p},m="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"namespaces"},"Namespaces"),(0,l.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,l.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,l.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,l.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,l.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,l.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,l.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,l.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,l.yg)("h3",{id:"fleet-local"},"fleet-local"),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,l.yg)("p",null,"When fleet is installed the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,l.yg)("h3",{id:"cattle-fleet-system"},"cattle-fleet-system"),(0,l.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,l.yg)("h3",{id:"cattle-fleet-clusters-system"},"cattle-fleet-clusters-system"),(0,l.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,l.yg)("h3",{id:"cluster-namespaces"},"Cluster namespaces"),(0,l.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces have are named in the form ",(0,l.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,l.yg)("h2",{id:"cross-namespace-deployments"},"Cross namespace deployments"),(0,l.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,l.yg)("p",null,"If you are creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,l.yg)("p",null,"A ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,l.yg)("p",null,"If the ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,l.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,l.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,l.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,l.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,l.yg)("p",null,"A namespace can contain multiple ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,l.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,l.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f94f0fba.cc86722b.js b/assets/js/f94f0fba.cc86722b.js deleted file mode 100644 index 8b2576f98..000000000 --- a/assets/js/f94f0fba.cc86722b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4731],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),h=c(a),u=l,g=h["".concat(s,".").concat(u)]||h[u]||p[u]||n;return a?r.createElement(g,o(o({ref:t},d),{},{components:a})):r.createElement(g,o({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[h]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"",date:"2024-05-02 12:18:29 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.4",id:"version-0.8/changelogs/changelogs/v0.8.4",title:"",description:"(rancherio-gh-m) released this 2024-05-02 1229 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.4.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.4",permalink:"/0.8/changelogs/changelogs/v0.8.4",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.4.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",date:"2024-05-02 12:18:29 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.3",permalink:"/0.8/changelogs/changelogs/v0.8.3"},next:{title:"v0.8.5",permalink:"/0.8/changelogs/changelogs/v0.8.5"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function p(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-05-02 12:18:29 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump google.golang.org/protobuf to v1.33.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231223828","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2307","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2307/hovercard",href:"https://github.com/rancher/fleet/pull/2307"},"#2307")),(0,l.yg)("li",null,"Bump github.com/docker/docker to v23.0.10 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231223828","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2307","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2307/hovercard",href:"https://github.com/rancher/fleet/pull/2307"},"#2307")),(0,l.yg)("li",null,"Bump github.com/hashicorp/go-getter to v1.7.4 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2256450628","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2351","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2351/hovercard",href:"https://github.com/rancher/fleet/pull/2351"},"#2351")),(0,l.yg)("li",null,"Bump golang.org/x/net to v0.23.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268166861","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2383","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2383/hovercard",href:"https://github.com/rancher/fleet/pull/2383"},"#2383")),(0,l.yg)("li",null,"Bump gitjob to v0.8.7 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268175505","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2386","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2386/hovercard",href:"https://github.com/rancher/fleet/pull/2386"},"#2386"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.3...v0.8.4"},(0,l.yg)("tt",null,"v0.8.3...v0.8.4"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-crd-0.8.4.tgz"},"fleet-crd-0.8.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-agent-0.8.4.tgz"},"fleet-agent-0.8.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-0.8.4.tgz"},"fleet-0.8.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.4"},"here"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f94f0fba.ee0f8da8.js b/assets/js/f94f0fba.ee0f8da8.js new file mode 100644 index 000000000..c30b1c56c --- /dev/null +++ b/assets/js/f94f0fba.ee0f8da8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4731],{5680:(e,t,a)=>{a.d(t,{xA:()=>d,yg:()=>g});var r=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var a=e.components,l=e.mdxType,n=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),h=c(a),u=l,g=h["".concat(s,".").concat(u)]||h[u]||p[u]||n;return a?r.createElement(g,o(o({ref:t},d),{},{components:a})):r.createElement(g,o({ref:t},d))}));function g(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var n=a.length,o=new Array(n);o[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[h]="string"==typeof e?e:l,o[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var r=a(8168),l=(a(6540),a(5680));const n={title:"",date:"2024-05-02 12:18:29 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.8.4",id:"version-0.8/changelogs/changelogs/v0.8.4",title:"",description:"(rancherio-gh-m) released this 2024-05-02 1229 +0000 UTC",source:"@site/versioned_docs/version-0.8/changelogs/changelogs/v0.8.4.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.8.4",permalink:"/0.8/changelogs/changelogs/v0.8.4",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/changelogs/changelogs/v0.8.4.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",date:"2024-05-02 12:18:29 +0000 UTC"},sidebar:"docs",previous:{title:"v0.8.3",permalink:"/0.8/changelogs/changelogs/v0.8.3"},next:{title:"v0.8.5",permalink:"/0.8/changelogs/changelogs/v0.8.5"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],d={toc:c},h="wrapper";function p(e){let{components:t,...a}=e;return(0,l.yg)(h,(0,r.A)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2024-05-02 12:18:29 +0000 UTC*")),(0,l.yg)("h2",{id:"description"},"Description"),(0,l.yg)("h2",null,"What's Changed"),(0,l.yg)("ul",null,(0,l.yg)("li",null,"Bump google.golang.org/protobuf to v1.33.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231223828","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2307","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2307/hovercard",href:"https://github.com/rancher/fleet/pull/2307"},"#2307")),(0,l.yg)("li",null,"Bump github.com/docker/docker to v23.0.10 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2231223828","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2307","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2307/hovercard",href:"https://github.com/rancher/fleet/pull/2307"},"#2307")),(0,l.yg)("li",null,"Bump github.com/hashicorp/go-getter to v1.7.4 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2256450628","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2351","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2351/hovercard",href:"https://github.com/rancher/fleet/pull/2351"},"#2351")),(0,l.yg)("li",null,"Bump golang.org/x/net to v0.23.0 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268166861","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2383","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2383/hovercard",href:"https://github.com/rancher/fleet/pull/2383"},"#2383")),(0,l.yg)("li",null,"Bump gitjob to v0.8.7 by ",(0,l.yg)("a",{class:"user-mention notranslate","data-hovercard-type":"user","data-hovercard-url":"/users/thardeck/hovercard","data-octo-click":"hovercard-link-click","data-octo-dimensions":"link_type:self",href:"https://github.com/thardeck"},"@thardeck")," in ",(0,l.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"2268175505","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/2386","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/2386/hovercard",href:"https://github.com/rancher/fleet/pull/2386"},"#2386"))),(0,l.yg)("p",null,(0,l.yg)("strong",null,"Full Changelog"),": ",(0,l.yg)("a",{class:"commit-link",href:"https://github.com/rancher/fleet/compare/v0.8.3...v0.8.4"},(0,l.yg)("tt",null,"v0.8.3...v0.8.4"))),(0,l.yg)("h2",{id:"download"},"Download"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-crd-0.8.4.tgz"},"fleet-crd-0.8.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-agent-0.8.4.tgz"},"fleet-agent-0.8.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-0.8.4.tgz"},"fleet-0.8.4.tgz"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("p",{parentName:"li"},(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.8.4/fleet-linux-arm64"},"fleet-linux-arm64")))),(0,l.yg)("p",null,(0,l.yg)("em",{parentName:"p"},"Information retrieved from ",(0,l.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.8.4"},"here"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fa2a1a7c.42c8ad3e.js b/assets/js/fa2a1a7c.42c8ad3e.js new file mode 100644 index 000000000..2a0f1aca6 --- /dev/null +++ b/assets/js/fa2a1a7c.42c8ad3e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7651],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),u=p(a),d=n,h=u["".concat(s,".").concat(d)]||u[d]||c[d]||l;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=a(8168),n=(a(6540),a(5680));const l={title:"Fleet v0.4.0",date:"2022-10-13 16:38:56 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.4.0",id:"version-0.4/changelogs/changelogs/v0.4.0",title:"Fleet v0.4.0",description:"(rancherio-gh-m) released this 2022-10-13 1656 +0000 UTC",source:"@site/versioned_docs/version-0.4/changelogs/changelogs/v0.4.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.4.0",permalink:"/0.4/changelogs/changelogs/v0.4.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/changelogs/changelogs/v0.4.0.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"Fleet v0.4.0",date:"2022-10-13 16:38:56 +0000 UTC"},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.4/uninstall"},next:{title:"Fleet v0.4.1",permalink:"/0.4/changelogs/changelogs/v0.4.1"}},s={},p=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:p},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.yg)(u,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2022-10-13 16:38:56 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"Additions"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Added the ability to utilize Helm ",(0,n.yg)("em",null,"atomic")," when installing and upgrading."),(0,n.yg)("li",null,"Added an RBAC rule for leases.coordination.k8s.io in the Gitjob chart.")),(0,n.yg)("p",null,(0,n.yg)("em",null,"Note: due to an issue in the fleet agent, when a bundle fails to install properly the agent goes into a cycle of repeatedly trying to reinstall. This happens when ",(0,n.yg)("strong",null,"atomic")," is set or there is an error with installing the bundle for another reason. This is the cause of issue ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"978032156","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/499","data-hovercard-type":"issue","data-hovercard-url":"/rancher/fleet/issues/499/hovercard",href:"https://github.com/rancher/fleet/issues/499"},"#499")," and is being worked on.")),(0,n.yg)("p",null,(0,n.yg)("em",null,"Note: due to an issue in the fleet controller the presence of a clusterregistrationtoken resource can lead to a higher than normal CPU load. The token expiry time is not updated correctly. The ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet/pull/995","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/995/hovercard"},"issue")," is fixed in the next version of fleet.")),(0,n.yg)("h2",null,"Bug Fixes"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Fixed an issue where the fleet agent can continuously delete resources")),(0,n.yg)("h2",null,"Changes"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Added CI testing to Gitjob"),(0,n.yg)("li",null,"Updated dependencies (Go modules and base container images)"),(0,n.yg)("li",null,"Updated to a newer version of the Tekton components used by Fleet"),(0,n.yg)("li",null,"Updated builds to Go 1.18"),(0,n.yg)("li",null,"Updated the base container images to use SLE BCI")),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-crd-0.4.0.tgz"},"fleet-crd-0.4.0.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-agent-0.4.0.tgz"},"fleet-agent-0.4.0.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-0.4.0.tgz"},"fleet-0.4.0.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.4.0"},"here"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fa2a1a7c.8b4232a9.js b/assets/js/fa2a1a7c.8b4232a9.js deleted file mode 100644 index 1a4026e24..000000000 --- a/assets/js/fa2a1a7c.8b4232a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7651],{5680:(e,t,a)=>{a.d(t,{xA:()=>g,yg:()=>h});var r=a(6540);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),p=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},g=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,g=i(e,["components","mdxType","originalType","parentName"]),u=p(a),d=n,h=u["".concat(s,".").concat(d)]||u[d]||c[d]||l;return a?r.createElement(h,o(o({ref:t},g),{},{components:a})):r.createElement(h,o({ref:t},g))}));function h(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:n,o[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var r=a(8168),n=(a(6540),a(5680));const l={title:"Fleet v0.4.0",date:"2022-10-13 16:38:56 +0000 UTC"},o=void 0,i={unversionedId:"changelogs/changelogs/v0.4.0",id:"version-0.4/changelogs/changelogs/v0.4.0",title:"Fleet v0.4.0",description:"(rancherio-gh-m) released this 2022-10-13 1656 +0000 UTC",source:"@site/versioned_docs/version-0.4/changelogs/changelogs/v0.4.0.md",sourceDirName:"changelogs/changelogs",slug:"/changelogs/changelogs/v0.4.0",permalink:"/0.4/changelogs/changelogs/v0.4.0",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/changelogs/changelogs/v0.4.0.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"Fleet v0.4.0",date:"2022-10-13 16:38:56 +0000 UTC"},sidebar:"docs",previous:{title:"Uninstall",permalink:"/0.4/uninstall"},next:{title:"Fleet v0.4.1",permalink:"/0.4/changelogs/changelogs/v0.4.1"}},s={},p=[{value:"Description",id:"description",level:2},{value:"Download",id:"download",level:2}],g={toc:p},u="wrapper";function c(e){let{components:t,...a}=e;return(0,n.yg)(u,(0,r.A)({},g,a,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"(rancherio-gh-m) released this 2022-10-13 16:38:56 +0000 UTC*")),(0,n.yg)("h2",{id:"description"},"Description"),(0,n.yg)("h2",null,"Additions"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Added the ability to utilize Helm ",(0,n.yg)("em",null,"atomic")," when installing and upgrading."),(0,n.yg)("li",null,"Added an RBAC rule for leases.coordination.k8s.io in the Gitjob chart.")),(0,n.yg)("p",null,(0,n.yg)("em",null,"Note: due to an issue in the fleet agent, when a bundle fails to install properly the agent goes into a cycle of repeatedly trying to reinstall. This happens when ",(0,n.yg)("strong",null,"atomic")," is set or there is an error with installing the bundle for another reason. This is the cause of issue ",(0,n.yg)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"978032156","data-permission-text":"Title is private","data-url":"https://github.com/rancher/fleet/issues/499","data-hovercard-type":"issue","data-hovercard-url":"/rancher/fleet/issues/499/hovercard",href:"https://github.com/rancher/fleet/issues/499"},"#499")," and is being worked on.")),(0,n.yg)("p",null,(0,n.yg)("em",null,"Note: due to an issue in the fleet controller the presence of a clusterregistrationtoken resource can lead to a higher than normal CPU load. The token expiry time is not updated correctly. The ",(0,n.yg)("a",{href:"https://github.com/rancher/fleet/pull/995","data-hovercard-type":"pull_request","data-hovercard-url":"/rancher/fleet/pull/995/hovercard"},"issue")," is fixed in the next version of fleet.")),(0,n.yg)("h2",null,"Bug Fixes"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Fixed an issue where the fleet agent can continuously delete resources")),(0,n.yg)("h2",null,"Changes"),(0,n.yg)("ul",null,(0,n.yg)("li",null,"Added CI testing to Gitjob"),(0,n.yg)("li",null,"Updated dependencies (Go modules and base container images)"),(0,n.yg)("li",null,"Updated to a newer version of the Tekton components used by Fleet"),(0,n.yg)("li",null,"Updated builds to Go 1.18"),(0,n.yg)("li",null,"Updated the base container images to use SLE BCI")),(0,n.yg)("h2",{id:"download"},"Download"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/sha256sum-amd64.txt"},"sha256sum-amd64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-windows-amd64.exe"},"fleetcontroller-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-linux-amd64"},"fleetcontroller-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-windows-amd64.exe"},"fleetagent-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-linux-amd64"},"fleetagent-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-windows-amd64.exe"},"fleet-windows-amd64.exe"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-linux-amd64"},"fleet-linux-amd64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-crd-0.4.0.tgz"},"fleet-crd-0.4.0.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-agent-0.4.0.tgz"},"fleet-agent-0.4.0.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-0.4.0.tgz"},"fleet-0.4.0.tgz"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/sha256sum-arm64.txt"},"sha256sum-arm64.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-linux-arm64"},"fleetcontroller-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-linux-arm64"},"fleetagent-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-linux-arm64"},"fleet-linux-arm64"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/sha256sum-s390x.txt"},"sha256sum-s390x.txt"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetcontroller-linux-s390x"},"fleetcontroller-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleetagent-linux-s390x"},"fleetagent-linux-s390x"))),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("p",{parentName:"li"},(0,n.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/releases/download/v0.4.0/fleet-linux-s390x"},"fleet-linux-s390x")))),(0,n.yg)("p",null,(0,n.yg)("em",{parentName:"p"},"Information retrieved from ",(0,n.yg)("a",{parentName:"em",href:"https://github.com/rancher/fleet/releases/tag/v0.4.0"},"here"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb76c575.2b5ac70b.js b/assets/js/fb76c575.2b5ac70b.js new file mode 100644 index 000000000..014aff608 --- /dev/null +++ b/assets/js/fb76c575.2b5ac70b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[456],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var o=a.createContext({}),p=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},g=function(e){var t=p(e.components);return a.createElement(o.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,g=s(e,["components","mdxType","originalType","parentName"]),c=p(n),d=l,m=c["".concat(o,".").concat(d)]||c[d]||u[d]||r;return n?a.createElement(m,i(i({ref:t},g),{},{components:n})):a.createElement(m,i({ref:t},g))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[c]="string"==typeof e?e:l,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=n(8168),l=(n(6540),n(5680));const r={},i="Agent Initiated",s={unversionedId:"agent-initiated",id:"version-0.4/agent-initiated",title:"Agent Initiated",description:"Refer to the overview page for a background information on the agent initiated registration style.",source:"@site/versioned_docs/version-0.4/agent-initiated.md",sourceDirName:".",slug:"/agent-initiated",permalink:"/0.4/agent-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/agent-initiated.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Tokens",permalink:"/0.4/cluster-tokens"},next:{title:"Manager Initiated",permalink:"/0.4/manager-initiated"}},o={},p=[{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:2},{value:"Install agent for a new Cluster",id:"install-agent-for-a-new-cluster",level:2},{value:"Install agent for a predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:2}],g={toc:p},c="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(c,(0,a.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"agent-initiated"},"Agent Initiated"),(0,l.yg)("p",null,"Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the agent initiated registration style."),(0,l.yg)("h2",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,l.yg)("p",null,"A downstream cluster is registered using the ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,l.yg)("strong",{parentName:"p"},"client ID")," or ",(0,l.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required. Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token page")," for more information\non how to create tokens and obtain the values. The cluster registration token is manifested as a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will\nbe passed to the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install")," process."),(0,l.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,l.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,l.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,l.yg)("h2",{id:"install-agent-for-a-new-cluster"},"Install agent for a new Cluster"),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,l.yg)("p",null,"First, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,l.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,l.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,l.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,l.yg)("p",null,"Value in ",(0,l.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,l.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,l.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"warning"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-agent-0.4.1.tgz\n')),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.4/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,l.yg)("h2",{id:"install-agent-for-a-predefined-cluster"},"Install agent for a predefined Cluster"),(0,l.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,l.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,l.yg)("p",null,"First, create a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,l.yg)("p",null,"Second, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,l.yg)("p",null,"Third, setup your environment to use the client ID."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-agent-v0.4.1.tgz\n')),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.4/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb76c575.cef46e98.js b/assets/js/fb76c575.cef46e98.js deleted file mode 100644 index fb40f499e..000000000 --- a/assets/js/fb76c575.cef46e98.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[456],{5680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var o=a.createContext({}),p=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},g=function(e){var t=p(e.components);return a.createElement(o.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,g=s(e,["components","mdxType","originalType","parentName"]),c=p(n),d=l,m=c["".concat(o,".").concat(d)]||c[d]||u[d]||r;return n?a.createElement(m,i(i({ref:t},g),{},{components:n})):a.createElement(m,i({ref:t},g))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[c]="string"==typeof e?e:l,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=n(8168),l=(n(6540),n(5680));const r={},i="Agent Initiated",s={unversionedId:"agent-initiated",id:"version-0.4/agent-initiated",title:"Agent Initiated",description:"Refer to the overview page for a background information on the agent initiated registration style.",source:"@site/versioned_docs/version-0.4/agent-initiated.md",sourceDirName:".",slug:"/agent-initiated",permalink:"/0.4/agent-initiated",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/agent-initiated.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Tokens",permalink:"/0.4/cluster-tokens"},next:{title:"Manager Initiated",permalink:"/0.4/manager-initiated"}},o={},p=[{value:"Cluster Registration Token and Client ID",id:"cluster-registration-token-and-client-id",level:2},{value:"Install agent for a new Cluster",id:"install-agent-for-a-new-cluster",level:2},{value:"Install agent for a predefined Cluster",id:"install-agent-for-a-predefined-cluster",level:2}],g={toc:p},c="wrapper";function u(e){let{components:t,...n}=e;return(0,l.yg)(c,(0,a.A)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"agent-initiated"},"Agent Initiated"),(0,l.yg)("p",null,"Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-overview#agent-initiated-registration"},"overview page")," for a background information on the agent initiated registration style."),(0,l.yg)("h2",{id:"cluster-registration-token-and-client-id"},"Cluster Registration Token and Client ID"),(0,l.yg)("p",null,"A downstream cluster is registered using the ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," and optionally a ",(0,l.yg)("strong",{parentName:"p"},"client ID")," or ",(0,l.yg)("strong",{parentName:"p"},"cluster labels"),"."),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"cluster registration token")," is a credential that will authorize the downstream cluster agent to be\nable to initiate the registration process. This is required. Refer to the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token page")," for more information\non how to create tokens and obtain the values. The cluster registration token is manifested as a ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file that will\nbe passed to the ",(0,l.yg)("inlineCode",{parentName:"p"},"helm install")," process."),(0,l.yg)("p",null,"There are two styles of registering an agent. You can have the cluster for this agent dynamically created, in which\ncase you will probably want to specify ",(0,l.yg)("strong",{parentName:"p"},"cluster labels")," upon registration. Or you can have the agent register to a predefined\ncluster in the Fleet manager, in which case you will need a ",(0,l.yg)("strong",{parentName:"p"},"client ID"),". The former approach is typically the easiest."),(0,l.yg)("h2",{id:"install-agent-for-a-new-cluster"},"Install agent for a new Cluster"),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. Following are explanations how to determine and set its parameters."),(0,l.yg)("p",null,"First, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," which contains\nthe registration token to authenticate against the Fleet cluster."),(0,l.yg)("p",null,"Second, optionally you can define labels that will assigned to the newly created cluster upon registration. After\nregistration is completed an agent cannot change the labels of the cluster. To add cluster labels add\n",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.KEY=VALUE")," to the below Helm command. To add the labels ",(0,l.yg)("inlineCode",{parentName:"p"},"foo=bar")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"bar=baz")," then you would\nadd ",(0,l.yg)("inlineCode",{parentName:"p"},"--set-string labels.foo=bar --set-string labels.bar=baz")," to the command line."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'# Leave blank if you do not want any labels\nCLUSTER_LABELS="--set-string labels.example=true --set-string labels.env=dev"\n')),(0,l.yg)("p",null,"Third, set variables with the Fleet cluster's API Server URL and CA, for the downstream cluster to use for connecting."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"API_SERVER_URL=https://...\nAPI_SERVER_CA_DATA=...\n")),(0,l.yg)("p",null,"Value in ",(0,l.yg)("inlineCode",{parentName:"p"},"API_SERVER_CA_DATA")," can be obtained from a ",(0,l.yg)("inlineCode",{parentName:"p"},".kube/config")," file with valid data to connect to the upstream cluster\n(under the ",(0,l.yg)("inlineCode",{parentName:"p"},"certificate-authority-data")," key). Alternatively it can be obtained from within the upstream cluster itself,\nby looking up the default ServiceAccount secret name (typically prefixed with ",(0,l.yg)("inlineCode",{parentName:"p"},"default-token-"),", in the default namespace),\nunder the ",(0,l.yg)("inlineCode",{parentName:"p"},"ca.crt")," key."),(0,l.yg)("admonition",{type:"caution"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"warning"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n $CLUSTER_LABELS \\\n --values values.yaml \\\n --set apiServerCA="$API_SERVER_CA_DATA" \\\n --set apiServerURL="$API_SERVER_URL" \\\n fleet-agent https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-agent-0.4.1.tgz\n')),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.4/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\ncluster-ab13e54400f1 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")),(0,l.yg)("h2",{id:"install-agent-for-a-predefined-cluster"},"Install agent for a predefined Cluster"),(0,l.yg)("p",null,"Client IDs are for the purpose of predefining clusters in the Fleet manager with existing labels and repos targeted to them.\nA client ID is not required and is just one approach to managing clusters.\nThe ",(0,l.yg)("strong",{parentName:"p"},"client ID")," is a unique string that will identify the cluster.\nThis string is user generated and opaque to the Fleet manager and agent. It is assumed to be sufficiently unique. For security reasons one should not be able to easily guess this value\nas then one cluster could impersonate another. The client ID is optional and if not specified the UID field of the ",(0,l.yg)("inlineCode",{parentName:"p"},"kube-system")," namespace\nresource will be used as the client ID. Upon registration if the client ID is found on a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource in the Fleet manager it will associate\nthe agent with that ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". If no ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource is found with that client ID a new ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," resource will be created with the specific\nclient ID."),(0,l.yg)("p",null,"The Fleet agent is installed as a Helm chart. The only parameters to the helm chart installation should be the cluster registration token, which\nis represented by the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file and the client ID. The client ID is optional."),(0,l.yg)("p",null,"First, create a ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," in the Fleet Manager with the random client ID you have chosen."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: Cluster\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: my-cluster\n namespace: clusters\nspec:\n clientID: "really-random"\n')),(0,l.yg)("p",null,"Second, follow the ",(0,l.yg)("a",{parentName:"p",href:"/0.4/cluster-tokens"},"cluster registration token page")," to obtain the ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml")," file to be used."),(0,l.yg)("p",null,"Third, setup your environment to use the client ID."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'CLUSTER_CLIENT_ID="really-random"\n')),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Use proper namespace and release name"),":\nFor the agent chart the namespace must be ",(0,l.yg)("inlineCode",{parentName:"p"},"cattle-fleet-system")," and the release name ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-agent"))),(0,l.yg)("admonition",{type:"note"},(0,l.yg)("p",{parentName:"admonition"},(0,l.yg)("strong",{parentName:"p"},"Ensure you are installing to the right cluster"),":\nHelm will use the default context in ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," to deploy the agent. Use ",(0,l.yg)("inlineCode",{parentName:"p"},"--kubeconfig")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"--kube-context"),"\nto change which cluster Helm is installing to.")),(0,l.yg)("p",null,"Finally, install the agent using Helm."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},'helm -n cattle-fleet-system install --create-namespace --wait \\\n --set clientID="$CLUSTER_CLIENT_ID" \\\n --values values.yaml \\\n fleet-agent https://github.com/rancher/fleet/releases/download/v0.4.1/fleet-agent-v0.4.1.tgz\n')),(0,l.yg)("p",null,"The agent should now be deployed. You can check that status of the fleet pods by running the below commands."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"# Ensure kubectl is pointing to the right cluster\nkubectl -n cattle-fleet-system logs -l app=fleet-agent\nkubectl -n cattle-fleet-system get pods -l app=fleet-agent\n")),(0,l.yg)("p",null,"Additionally you should see a new cluster registered in the Fleet manager. Below is an example of checking that a new cluster\nwas registered in the ",(0,l.yg)("inlineCode",{parentName:"p"},"clusters")," ",(0,l.yg)("a",{parentName:"p",href:"/0.4/namespaces"},"namespace"),". Please ensure your ",(0,l.yg)("inlineCode",{parentName:"p"},"${HOME}/.kube/config")," is pointed to the Fleet\nmanager to run this command."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-shell"},"kubectl -n clusters get clusters.fleet.cattle.io\n")),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"NAME BUNDLES-READY NODES-READY SAMPLE-NODE LAST-SEEN STATUS\nmy-cluster 1/1 1/1 k3d-cluster2-server-0 2020-08-31T19:23:10Z \n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fbaf079d.ee95f6dd.js b/assets/js/fbaf079d.ee95f6dd.js deleted file mode 100644 index 9ec37315f..000000000 --- a/assets/js/fbaf079d.ee95f6dd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4282],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(s,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:o,r[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",l={unversionedId:"bundle-diffs",id:"bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/docs/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/bundle-diffs.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/webhook"}},s={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/fbaf079d.f5b23e9a.js b/assets/js/fbaf079d.f5b23e9a.js new file mode 100644 index 000000000..a95229b3e --- /dev/null +++ b/assets/js/fbaf079d.f5b23e9a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4282],{5680:(e,n,t)=>{t.d(n,{xA:()=>c,yg:()=>u});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=p(t),g=o,u=d["".concat(s,".").concat(g)]||d[g]||m[g]||i;return t?a.createElement(u,r(r({ref:n},c),{},{components:t})):a.createElement(u,r({ref:n},c))}));function u(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var i=t.length,r=new Array(i);r[0]=g;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:o,r[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=t(8168),o=(t(6540),t(5680));const i={},r="Generating Diffs to Ignore Modified GitRepos",l={unversionedId:"bundle-diffs",id:"bundle-diffs",title:"Generating Diffs to Ignore Modified GitRepos",description:"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.",source:"@site/docs/bundle-diffs.md",sourceDirName:".",slug:"/bundle-diffs",permalink:"/bundle-diffs",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/bundle-diffs.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Mapping to Downstream Clusters",permalink:"/gitrepo-targets"},next:{title:"Using Webhooks Instead of Polling",permalink:"/webhook"}},s={},p=[{value:"Simple Example",id:"simple-example",level:2},{value:"Gatekeeper Example",id:"gatekeeper-example",level:2},{value:"1. ValidatingWebhookConfiguration:",id:"1-validatingwebhookconfiguration",level:3},{value:"2. Deployment gatekeeper-controller-manager:",id:"2-deployment-gatekeeper-controller-manager",level:3},{value:"3. Deployment gatekeeper-audit:",id:"3-deployment-gatekeeper-audit",level:3},{value:"Combining It All Together",id:"combining-it-all-together",level:3}],c={toc:p},d="wrapper";function m(e){let{components:n,...i}=e;return(0,o.yg)(d,(0,a.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"generating-diffs-to-ignore-modified-gitrepos"},"Generating Diffs to Ignore Modified GitRepos"),(0,o.yg)("p",null,"Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles."),(0,o.yg)("p",null,"You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the ",(0,o.yg)("inlineCode",{parentName:"p"},"Bundles")," section."),(0,o.yg)("p",null,"The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the ",(0,o.yg)("inlineCode",{parentName:"p"},"caBundle")," is empty and the CA cert is injected by the cluster."),(0,o.yg)("p",null,'This leads the status of the bundle and associated GitRepo to be reported as "Modified"'),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(9136).A,width:"1191",height:"344"})),(0,o.yg)("p",null,"Associated Bundle\n",(0,o.yg)("img",{src:t(2370).A,width:"1188",height:"420"})),(0,o.yg)("p",null,"Fleet bundles support the ability to specify a custom ",(0,o.yg)("a",{parentName:"p",href:"http://jsonpatch.com/"},"jsonPointer patch"),"."),(0,o.yg)("p",null,"With the patch, users can instruct fleet to ignore object modifications."),(0,o.yg)("h2",{id:"simple-example"},"Simple Example"),(0,o.yg)("p",null,"In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto."),(0,o.yg)("p",null,(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs"},"https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs")),(0,o.yg)("h2",{id:"gatekeeper-example"},"Gatekeeper Example"),(0,o.yg)("p",null,"In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters."),(0,o.yg)("p",null,"The opa-gatekeeper bundle associated with the opa GitRepo is in modified state."),(0,o.yg)("p",null,"Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status."),(0,o.yg)("p",null,"In our case the differences detected are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' summary:\n desiredReady: 1\n modified: 1\n nonReadyResources:\n - bundleState: Modified\n modifiedStatus:\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n patch: \'{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n patch: \'{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}\'\n')),(0,o.yg)("p",null,"Based on this summary, there are three objects which need to be patched."),(0,o.yg)("p",null,"We will look at these one at a time."),(0,o.yg)("h3",{id:"1-validatingwebhookconfiguration"},"1. ValidatingWebhookConfiguration:"),(0,o.yg)("p",null,"The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec."),(0,o.yg)("p",null,"In cases where more than one element in the field requires a patch, that patch will refer these to as ",(0,o.yg)("inlineCode",{parentName:"p"},"$setElementOrder/ELEMENTNAME")),(0,o.yg)("p",null,"From this information, we can see the two ValidatingWebhooks in question are:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' "$setElementOrder/webhooks": [\n {\n "name": "validation.gatekeeper.sh"\n },\n {\n "name": "check-ignore-label.gatekeeper.sh"\n }\n ],\n')),(0,o.yg)("p",null,"Within each ValidatingWebhook, the fields that need to be ignore are as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "validation.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n "*"\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "*"\n ]\n }\n ]\n },\n')),(0,o.yg)("p",null," and"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},' {\n "clientConfig": {\n "caBundle": "Cg=="\n },\n "name": "check-ignore-label.gatekeeper.sh",\n "rules": [\n {\n "apiGroups": [\n ""\n ],\n "apiVersions": [\n "*"\n ],\n "operations": [\n "CREATE",\n "UPDATE"\n ],\n "resources": [\n "namespaces"\n ]\n }\n ]\n }\n')),(0,o.yg)("p",null,"In summary, we need to ignore the fields ",(0,o.yg)("inlineCode",{parentName:"p"},"rules")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"clientConfig.caBundle")," in our patch specification."),(0,o.yg)("p",null,"The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values."),(0,o.yg)("p",null,(0,o.yg)("img",{src:t(4869).A,width:"1104",height:"837"})),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("h3",{id:"2-deployment-gatekeeper-controller-manager"},"2. Deployment gatekeeper-controller-manager:"),(0,o.yg)("p",null,"The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle)."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"3-deployment-gatekeeper-audit"},"3. Deployment gatekeeper-audit:"),(0,o.yg)("p",null,"The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre"},'{\n "spec": {\n "template": {\n "spec": {\n "$setElementOrder/containers": [\n {\n "name": "manager"\n }\n ],\n "containers": [\n {\n "name": "manager",\n "resources": {\n "limits": {\n "cpu": "1000m"\n }\n }\n }\n ],\n "tolerations": []\n }\n }\n }\n}\n')),(0,o.yg)("p",null,"Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added."),(0,o.yg)("p",null,"Based on this information, our diff patch would look as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},' - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n')),(0,o.yg)("h3",{id:"combining-it-all-together"},"Combining It All Together"),(0,o.yg)("p",null,"We can now combine all these patches as follows:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml"},'diff:\n comparePatches:\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-audit\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: apps/v1\n kind: Deployment\n name: gatekeeper-controller-manager\n namespace: cattle-gatekeeper-system\n operations:\n - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}\n - {"op": "remove", "path": "/spec/template/spec/tolerations"}\n - apiVersion: admissionregistration.k8s.io/v1\n kind: ValidatingWebhookConfiguration\n name: gatekeeper-validating-webhook-configuration\n operations:\n - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/0/rules"}\n - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}\n - {"op": "remove", "path":"/webhooks/1/rules"}\n')),(0,o.yg)("p",null,"We can add these now to the bundle directly to test and also commit the same to the ",(0,o.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," in your GitRepo."),(0,o.yg)("p",null,'Once these are added, the GitRepo should deploy and be in "Active" status.'))}m.isMDXComponent=!0},2370:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedBundle-636a094dc9a854e2cc752ad34fcadd60.png"},9136:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/ModifiedGitRepo-17a5600892cf08e11388c8612131d81d.png"},4869:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/WebhookConfigurationSpec-0721d92eb5e5e87e815ad8fe32242bed.png"}}]); \ No newline at end of file diff --git a/assets/js/fbcf914d.7e6d10e5.js b/assets/js/fbcf914d.c8f66d08.js similarity index 54% rename from assets/js/fbcf914d.7e6d10e5.js rename to assets/js/fbcf914d.c8f66d08.js index f6d5f4b47..76c84af94 100644 --- a/assets/js/fbcf914d.7e6d10e5.js +++ b/assets/js/fbcf914d.c8f66d08.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4266],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.8/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.8/index.md",sourceDirName:".",slug:"/",permalink:"/0.8/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/index.md",tags:[],version:"0.8",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.8/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[4266],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>f});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=n(8168),a=(n(6540),n(5680));const o={},i="Overview",s={unversionedId:"index",id:"version-0.8/index",title:"Overview",description:"What is Fleet?",source:"@site/versioned_docs/version-0.8/index.md",sourceDirName:".",slug:"/",permalink:"/0.8/",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.8/index.md",tags:[],version:"0.8",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",next:{title:"Quick Start",permalink:"/0.8/quickstart"}},l={},c=[{value:"What is Fleet?",id:"what-is-fleet",level:3},{value:"Configuration Management",id:"configuration-management",level:3}],u={toc:c},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,r.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"overview"},"Overview"),(0,a.yg)("p",null,(0,a.yg)("img",{src:n(6336).A,width:"1366",height:"960"})),(0,a.yg)("h3",{id:"what-is-fleet"},"What is Fleet?"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Cluster engine"),": Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through ",(0,a.yg)("strong",{parentName:"p"},"GitOps"),". Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("p",{parentName:"li"},(0,a.yg)("strong",{parentName:"p"},"Deployment management"),": Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters."))),(0,a.yg)("h3",{id:"configuration-management"},"Configuration Management"),(0,a.yg)("p",null,"Fleet is fundamentally a set of Kubernetes ",(0,a.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/concepts/"},"custom resource definitions (CRDs)")," and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point."))}d.isMDXComponent=!0},6336:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/fleet-architecture-f708ce634648101dc98f451dcd59fe84.svg"}}]); \ No newline at end of file diff --git a/assets/js/fd06576e.b16bac86.js b/assets/js/fd06576e.b16bac86.js new file mode 100644 index 000000000..6bdec72bd --- /dev/null +++ b/assets/js/fd06576e.b16bac86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1144],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>y});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=n.createContext({}),p=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=p(e.components);return n.createElement(o.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(a),u=l,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||s;return a?n.createElement(y,r(r({ref:t},c),{},{components:a})):n.createElement(y,r({ref:t},c))}));function y(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,r=new Array(s);r[0]=u;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[m]="string"==typeof e?e:l,r[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const s={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.5/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.5/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.5/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/namespaces.md",tags:[],version:"0.5",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Groups",permalink:"/0.5/cluster-group"},next:{title:"Adding a GitRepo",permalink:"/0.5/gitrepo-add"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local",id:"fleet-local",level:3},{value:"cattle-fleet-system",id:"cattle-fleet-system",level:3},{value:"cattle-fleet-clusters-system",id:"cattle-fleet-clusters-system",level:3},{value:"Cluster namespaces",id:"cluster-namespaces",level:3},{value:"Cross namespace deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2}],c={toc:p},m="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"namespaces"},"Namespaces"),(0,l.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,l.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,l.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,l.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,l.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,l.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,l.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,l.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,l.yg)("h3",{id:"fleet-local"},"fleet-local"),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,l.yg)("p",null,"When fleet is installed the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,l.yg)("h3",{id:"cattle-fleet-system"},"cattle-fleet-system"),(0,l.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,l.yg)("h3",{id:"cattle-fleet-clusters-system"},"cattle-fleet-clusters-system"),(0,l.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,l.yg)("h3",{id:"cluster-namespaces"},"Cluster namespaces"),(0,l.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,l.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,l.yg)("h2",{id:"cross-namespace-deployments"},"Cross namespace deployments"),(0,l.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,l.yg)("p",null,"If you are creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,l.yg)("p",null,"A ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,l.yg)("p",null,"If the ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,l.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,l.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,l.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,l.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,l.yg)("p",null,"A namespace can contain multiple ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,l.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,l.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd06576e.ebbbf5e7.js b/assets/js/fd06576e.ebbbf5e7.js deleted file mode 100644 index d63d7af30..000000000 --- a/assets/js/fd06576e.ebbbf5e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[1144],{5680:(e,t,a)=>{a.d(t,{xA:()=>c,yg:()=>y});var n=a(6540);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var o=n.createContext({}),p=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},c=function(e){var t=p(e.components);return n.createElement(o.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,s=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(a),u=l,y=m["".concat(o,".").concat(u)]||m[u]||d[u]||s;return a?n.createElement(y,r(r({ref:t},c),{},{components:a})):n.createElement(y,r({ref:t},c))}));function y(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var s=a.length,r=new Array(s);r[0]=u;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[m]="string"==typeof e?e:l,r[1]=i;for(var p=2;p{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var n=a(8168),l=(a(6540),a(5680));const s={},r="Namespaces",i={unversionedId:"namespaces",id:"version-0.5/namespaces",title:"Namespaces",description:"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces",source:"@site/versioned_docs/version-0.5/namespaces.md",sourceDirName:".",slug:"/namespaces",permalink:"/0.5/namespaces",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.5/namespaces.md",tags:[],version:"0.5",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Groups",permalink:"/0.5/cluster-group"},next:{title:"Adding a GitRepo",permalink:"/0.5/gitrepo-add"}},o={},p=[{value:"GitRepos, Bundles, Clusters, ClusterGroups",id:"gitrepos-bundles-clusters-clustergroups",level:2},{value:"Namespace Creation Behavior in Bundles",id:"namespace-creation-behavior-in-bundles",level:2},{value:"Special Namespaces",id:"special-namespaces",level:2},{value:"fleet-local",id:"fleet-local",level:3},{value:"cattle-fleet-system",id:"cattle-fleet-system",level:3},{value:"cattle-fleet-clusters-system",id:"cattle-fleet-clusters-system",level:3},{value:"Cluster namespaces",id:"cluster-namespaces",level:3},{value:"Cross namespace deployments",id:"cross-namespace-deployments",level:2},{value:"Restricting GitRepos",id:"restricting-gitrepos",level:2}],c={toc:p},m="wrapper";function d(e){let{components:t,...a}=e;return(0,l.yg)(m,(0,n.A)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"namespaces"},"Namespaces"),(0,l.yg)("p",null,"All types in the Fleet manager are namespaced. The namespaces of the manager types do not correspond to the namespaces\nof the deployed resources in the downstream cluster. Understanding how namespaces are used in the Fleet manager is\nimportant to understand the security model and how one can use Fleet in a multi-tenant fashion."),(0,l.yg)("h2",{id:"gitrepos-bundles-clusters-clustergroups"},"GitRepos, Bundles, Clusters, ClusterGroups"),(0,l.yg)("p",null,"The primary types are all scoped to a namespace. All selectors for ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," targets will be evaluated against\nthe ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroups")," in the same namespaces. This means that if you give ",(0,l.yg)("inlineCode",{parentName:"p"},"create")," or ",(0,l.yg)("inlineCode",{parentName:"p"},"update")," privileges\nto a the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," type in a namespace, that end user can modify the selector to match any cluster in that namespace.\nThis means in practice if you want to have two teams self manage their own ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," registrations but they should\nnot be able to target each others clusters, they should be in different namespaces."),(0,l.yg)("h2",{id:"namespace-creation-behavior-in-bundles"},"Namespace Creation Behavior in Bundles"),(0,l.yg)("p",null,"When deploying a Fleet bundle, the specified namespace will automatically be created if it does not already exist."),(0,l.yg)("h2",{id:"special-namespaces"},"Special Namespaces"),(0,l.yg)("h3",{id:"fleet-local"},"fleet-local"),(0,l.yg)("p",null,"The ",(0,l.yg)("strong",{parentName:"p"},"fleet-local")," namespace is a special namespace used for the single cluster use case or to bootstrap\nthe configuration of the Fleet manager."),(0,l.yg)("p",null,"When fleet is installed the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," namespace is created along with one ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," and one\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," called ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". If no targets are specified on a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),", it is by default targeted to the\n",(0,l.yg)("inlineCode",{parentName:"p"},"ClusterGroup")," named ",(0,l.yg)("inlineCode",{parentName:"p"},"default"),". This means that all ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," created in ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet-local")," will\nautomatically target the ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster"),". The ",(0,l.yg)("inlineCode",{parentName:"p"},"local")," ",(0,l.yg)("inlineCode",{parentName:"p"},"Cluster")," refers to the cluster the Fleet manager is running\non."),(0,l.yg)("h3",{id:"cattle-fleet-system"},"cattle-fleet-system"),(0,l.yg)("p",null,"The Fleet controller and Fleet agent run in this namespace. All service accounts referenced by ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," are expected\nto live in this namespace in the downstream cluster."),(0,l.yg)("h3",{id:"cattle-fleet-clusters-system"},"cattle-fleet-clusters-system"),(0,l.yg)("p",null,"This namespace holds secrets for the cluster registration process. It should contain no other resources in it,\nespecially secrets."),(0,l.yg)("h3",{id:"cluster-namespaces"},"Cluster namespaces"),(0,l.yg)("p",null,"For every cluster that is registered a namespace is created by the Fleet manager for that cluster.\nThese namespaces are named in the form ",(0,l.yg)("inlineCode",{parentName:"p"},"cluster-${namespace}-${cluster}-${random}"),". The purpose of this\nnamespace is that all ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," for that cluster are put into this namespace and\nthen the downstream cluster is given access to watch and update ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployments")," in that namespace only."),(0,l.yg)("h2",{id:"cross-namespace-deployments"},"Cross namespace deployments"),(0,l.yg)("p",null,"It is possible to create a GitRepo that will deploy across namespaces. The primary purpose of this is so that a\ncentral privileged team can manage common configuration for many clusters that are managed by different teams. The way\nthis is accomplished is by creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource in a cluster."),(0,l.yg)("p",null,"If you are creating a ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," resource it is best to do it in a namespace that only contains ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\nand no ",(0,l.yg)("inlineCode",{parentName:"p"},"Clusters"),". It seems to get confusing if you have Clusters in the same repo as the cross namespace ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos")," will still\nalways be evaluated against the current namespace. So if you have clusters in the same namespace you may wish to make them\ncanary clusters."),(0,l.yg)("p",null,"A ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMapping")," has only two fields. Which are as below"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},"kind: BundleNamespaceMapping\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: not-important\n namespace: typically-unique\n\n# Bundles to match by label. The labels are defined in the fleet.yaml\n# labels field or from the GitRepo metadata.labels field\nbundleSelector:\n matchLabels:\n foo: bar\n\n# Namespaces to match by label\nnamespaceSelector:\n matchLabels:\n foo: bar\n")),(0,l.yg)("p",null,"If the ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleNamespaceMappings")," ",(0,l.yg)("inlineCode",{parentName:"p"},"bundleSelector")," field matches a ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundles")," labels then that ",(0,l.yg)("inlineCode",{parentName:"p"},"Bundle")," target criteria will\nbe evaluated against all clusters in all namespaces that match ",(0,l.yg)("inlineCode",{parentName:"p"},"namespaceSelector"),". One can specify labels for the created\nbundles from git by putting labels in the ",(0,l.yg)("inlineCode",{parentName:"p"},"fleet.yaml")," file or on the ",(0,l.yg)("inlineCode",{parentName:"p"},"metadata.labels")," field on the ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo"),"."),(0,l.yg)("h2",{id:"restricting-gitrepos"},"Restricting GitRepos"),(0,l.yg)("p",null,"A namespace can contain multiple ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepoRestriction")," resources. All ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepos"),"\ncreated in that namespace will be checked against the list of restrictions.\nIf a ",(0,l.yg)("inlineCode",{parentName:"p"},"GitRepo")," violates one of the constraints its ",(0,l.yg)("inlineCode",{parentName:"p"},"BundleDeployment")," will be\nin an error state and won't be deployed."),(0,l.yg)("p",null,"This can also be used to set the defaults for GitRepo's ",(0,l.yg)("inlineCode",{parentName:"p"},"serviceAccount")," and ",(0,l.yg)("inlineCode",{parentName:"p"},"clientSecretName")," fields."),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepoRestriction\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: restriction\n namespace: typically-unique\nallowedClientSecretNames: []\nallowedRepoPatterns: []\nallowedServiceAccounts: []\ndefaultClientSecretName: ""\ndefaultServiceAccount: ""\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd26103c.4afcb136.js b/assets/js/fd26103c.4afcb136.js new file mode 100644 index 000000000..fe8d362bd --- /dev/null +++ b/assets/js/fd26103c.4afcb136.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7640],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),g=a,m=u["".concat(i,".").concat(g)]||u[g]||d[g]||l;return r?n.createElement(m,o(o({ref:t},p),{},{components:r})):n.createElement(m,o({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const l={},o="Mapping to Downstream Clusters",s={unversionedId:"gitrepo-targets",id:"version-0.4/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Multi-cluster Only:",source:"@site/versioned_docs/version-0.4/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.4/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/gitrepo-targets.md",tags:[],version:"0.4",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Expected Repo Structure",permalink:"/0.4/gitrepo-structure"},next:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.4/bundle-diffs"}},i={},c=[{value:"Defining targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default target",id:"default-target",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style")),(0,a.yg)("p",null,"When deploying ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,a.yg)("h2",{id:"defining-targets"},"Defining targets"),(0,a.yg)("p",null,"The deployment targets of ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,a.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n')),(0,a.yg)("h2",{id:"target-matching"},"Target Matching"),(0,a.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,a.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,a.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,a.yg)("h2",{id:"default-target"},"Default target"),(0,a.yg)("p",null,"If no target is set for the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,a.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd26103c.94d66cdf.js b/assets/js/fd26103c.94d66cdf.js deleted file mode 100644 index dbaf1c32e..000000000 --- a/assets/js/fd26103c.94d66cdf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7640],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),g=a,m=u["".concat(i,".").concat(g)]||u[g]||d[g]||l;return r?n.createElement(m,o(o({ref:t},p),{},{components:r})):n.createElement(m,o({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=g;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var n=r(8168),a=(r(6540),r(5680));const l={},o="Mapping to Downstream Clusters",s={unversionedId:"gitrepo-targets",id:"version-0.4/gitrepo-targets",title:"Mapping to Downstream Clusters",description:"Multi-cluster Only:",source:"@site/versioned_docs/version-0.4/gitrepo-targets.md",sourceDirName:".",slug:"/gitrepo-targets",permalink:"/0.4/gitrepo-targets",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.4/gitrepo-targets.md",tags:[],version:"0.4",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Expected Repo Structure",permalink:"/0.4/gitrepo-structure"},next:{title:"Generating Diffs for Modified GitRepos",permalink:"/0.4/bundle-diffs"}},i={},c=[{value:"Defining targets",id:"defining-targets",level:2},{value:"Target Matching",id:"target-matching",level:2},{value:"Default target",id:"default-target",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.yg)(u,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"mapping-to-downstream-clusters"},"Mapping to Downstream Clusters"),(0,a.yg)("admonition",{type:"info"},(0,a.yg)("p",{parentName:"admonition"},(0,a.yg)("strong",{parentName:"p"},"Multi-cluster Only"),":\nThis approach only applies if you are running Fleet in a multi-cluster style")),(0,a.yg)("p",null,"When deploying ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepos")," to downstream clusters the clusters must be mapped to a target."),(0,a.yg)("h2",{id:"defining-targets"},"Defining targets"),(0,a.yg)("p",null,"The deployment targets of ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," is done using the ",(0,a.yg)("inlineCode",{parentName:"p"},"spec.targets")," field to\nmatch clusters or cluster groups. The YAML specification is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},'kind: GitRepo\napiVersion: fleet.cattle.io/v1alpha1\nmetadata:\n name: myrepo\n namespace: clusters\nspec:\n repo: https://github.com/rancher/fleet-examples\n paths:\n - simple\n\n # Targets are evaluated in order and the first one to match is used. If\n # no targets match then the evaluated cluster will not be deployed to.\n targets:\n # The name of target. This value is largely for display and logging.\n # If not specified a default name of the format "target000" will be used\n - name: prod\n # A selector used to match clusters. The structure is the standard\n # metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified,\n # clusterSelector will be used only to further refine the selection after\n # clusterGroupSelector and clusterGroup is evaluated.\n clusterSelector:\n matchLabels:\n env: prod\n # A selector used to match cluster groups.\n clusterGroupSelector:\n matchLabels:\n region: us-east\n # A specific clusterGroup by name that will be selected\n clusterGroup: group1\n')),(0,a.yg)("h2",{id:"target-matching"},"Target Matching"),(0,a.yg)("p",null,"All clusters and cluster groups in the same namespace as the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be evaluated against all targets.\nIf any of the targets match the cluster then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will be deployed to the downstream cluster. If\nno match is made, then the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," will not be deployed to that cluster."),(0,a.yg)("p",null,'There are three approaches to matching clusters.\nOne can use cluster selectors, cluster group selectors, or an explicit cluster group name. All criteria is additive so\nthe final match is evaluated as "clusterSelector && clusterGroupSelector && clusterGroup". If any of the three have the\ndefault value it is dropped from the criteria. The default value is either null or "". It is important to realize\nthat the value ',(0,a.yg)("inlineCode",{parentName:"p"},"{}"),' for a selector means "match everything."'),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"# Match everything\nclusterSelector: {}\n# Selector ignored\nclusterSelector: null\n")),(0,a.yg)("h2",{id:"default-target"},"Default target"),(0,a.yg)("p",null,"If no target is set for the ",(0,a.yg)("inlineCode",{parentName:"p"},"GitRepo")," then the default targets value is applied. The default targets value is as below."),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-yaml"},"targets:\n- name: default\n clusterGroup: default\n")),(0,a.yg)("p",null,"This means if you wish to setup a default location non-configured GitRepos will go to, then just create a cluster group called default\nand add clusters to it."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd60c3a8.7f9d1bcd.js b/assets/js/fd60c3a8.7f9d1bcd.js new file mode 100644 index 000000000..69b704c65 --- /dev/null +++ b/assets/js/fd60c3a8.7f9d1bcd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6506],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),m=a,c=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"version-0.10/ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/versioned_docs/version-0.10/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.10/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-resources.md",tags:[],version:"0.10",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.10/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/0.10/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd60c3a8.8af593db.js b/assets/js/fd60c3a8.8af593db.js deleted file mode 100644 index 35e2e3e7f..000000000 --- a/assets/js/fd60c3a8.8af593db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[6506],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>c});var r=n(6540);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function g(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),y=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):g(g({},t),e)),n},p=function(e){var t=y(e.components);return r.createElement(i.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=y(n),m=a,c=u["".concat(i,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(c,g(g({ref:t},p),{},{components:n})):r.createElement(c,g({ref:t},p))}));function c(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,g=new Array(l);g[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[u]="string"==typeof e?e:a,g[1]=o;for(var y=2;y{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>g,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>y});var r=n(8168),a=(n(6540),n(5680));const l={},g="List of Deployed Resources",o={unversionedId:"ref-resources",id:"version-0.10/ref-resources",title:"List of Deployed Resources",description:"After installing Fleet in Rancher these resources are created in the upstream cluster.",source:"@site/versioned_docs/version-0.10/ref-resources.md",sourceDirName:".",slug:"/ref-resources",permalink:"/0.10/ref-resources",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.10/ref-resources.md",tags:[],version:"0.10",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Configuration",permalink:"/0.10/ref-configuration"},next:{title:"Custom Resources Spec",permalink:"/0.10/ref-crds"}},i={},y=[],p={toc:y},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.yg)(u,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"list-of-deployed-resources"},"List of Deployed Resources"),(0,a.yg)("p",null,"After installing Fleet in Rancher these resources are created in the upstream cluster."),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Type"),(0,a.yg)("th",{parentName:"tr",align:null},"Name"),(0,a.yg)("th",{parentName:"tr",align:null},"Namespace"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"From Helm, intial setup:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRole"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterRoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob-binding"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ConfigMap"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Deployment"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Role"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"RoleBinding"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Service"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-controller"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ServiceAccount"),(0,a.yg)("td",{parentName:"tr",align:null},"gitjob"),(0,a.yg)("td",{parentName:"tr",align:null},"cattle-fleet-system")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Generated:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"local"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"ClusterGroup"),(0,a.yg)("td",{parentName:"tr",align:null},"default"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-local")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"For each registered cluster:"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.provisioning.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null}),(0,a.yg)("td",{parentName:"tr",align:null},"by default fleet-default")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.management.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"generated"),(0,a.yg)("td",{parentName:"tr",align:null},"-")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"clusters.fleet.cattle.io"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"Bundle"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-default"),(0,a.yg)("td",{parentName:"tr",align:null})),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"BundleDeployment"),(0,a.yg)("td",{parentName:"tr",align:null},"cluster-fleet-local-local-ID"),(0,a.yg)("td",{parentName:"tr",align:null},"fleet-agent-local")))),(0,a.yg)("p",null,"Also see ","[namespaces]"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fe67fe92.22432ad1.js b/assets/js/fe67fe92.22432ad1.js new file mode 100644 index 000000000..830317e3f --- /dev/null +++ b/assets/js/fe67fe92.22432ad1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5103],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>m});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(r),u=l,m=f["".concat(s,".").concat(u)]||f[u]||d[u]||o;return r?n.createElement(m,a(a({ref:t},p),{},{components:r})):n.createElement(m,a({ref:t},p))}));function m(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.9/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.9/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.9",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.9/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.9/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function d(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --correct-drift Rollback any change made from outside of Fleet\n --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated\n --correct-drift-keep-fail-history Keep helm history for failed rollbacks\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n --helm-credentials-by-path-file string Path of file containing helm credentials for paths\n --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided\n -h, --help help for apply\n --keep-resources Keep resources created after the GitRepo or Bundle is deleted\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fe67fe92.f3912112.js b/assets/js/fe67fe92.f3912112.js deleted file mode 100644 index e80a5afad..000000000 --- a/assets/js/fe67fe92.f3912112.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[5103],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>m});var n=r(6540);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),f=c(r),u=l,m=f["".concat(s,".").concat(u)]||f[u]||d[u]||o;return r?n.createElement(m,a(a({ref:t},p),{},{components:r})):n.createElement(m,a({ref:t},p))}));function m(e,t){var r=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=r.length,a=new Array(o);a[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[f]="string"==typeof e?e:l,a[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(8168),l=(r(6540),r(5680));const o={title:"",sidebar_label:"fleet apply"},a=void 0,i={unversionedId:"cli/fleet-cli/fleet_apply",id:"version-0.9/cli/fleet-cli/fleet_apply",title:"",description:"fleet apply",source:"@site/versioned_docs/version-0.9/cli/fleet-cli/fleet_apply.md",sourceDirName:"cli/fleet-cli",slug:"/cli/fleet-cli/fleet_apply",permalink:"/0.9/cli/fleet-cli/fleet_apply",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.9/cli/fleet-cli/fleet_apply.md",tags:[],version:"0.9",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{title:"",sidebar_label:"fleet apply"},sidebar:"docs",previous:{title:"fleet",permalink:"/0.9/cli/fleet-cli/fleet"},next:{title:"fleet test",permalink:"/0.9/cli/fleet-cli/fleet_test"}},s={},c=[{value:"fleet apply",id:"fleet-apply",level:2},{value:"Options",id:"options",level:3},{value:"Options inherited from parent commands",id:"options-inherited-from-parent-commands",level:3},{value:"SEE ALSO",id:"see-also",level:3}],p={toc:c},f="wrapper";function d(e){let{components:t,...r}=e;return(0,l.yg)(f,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h2",{id:"fleet-apply"},"fleet apply"),(0,l.yg)("p",null,"Render a bundle into a Kubernetes resource and apply it in the Fleet Manager"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},"fleet apply [flags] BUNDLE_NAME PATH...\n")),(0,l.yg)("h3",{id:"options"},"Options"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"}," -b, --bundle-file string Location of the raw Bundle resource yaml\n --cacerts-file string Path of custom cacerts for helm repo\n --commit string Commit to assign to the bundle\n -c, --compress Force all resources to be compress\n --correct-drift Rollback any change made from outside of Fleet\n --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated\n --correct-drift-keep-fail-history Keep helm history for failed rollbacks\n --debug Turn on debug logging\n --debug-level int If debugging is enabled, set klog -v=X\n -f, --file string Location of the fleet.yaml\n --helm-credentials-by-path-file string Path of file containing helm credentials for paths\n --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided\n -h, --help help for apply\n --keep-resources Keep resources created after the GitRepo or Bundle is deleted\n -l, --label strings Labels to apply to created bundles\n -o, --output string Output contents to file or - for stdout\n --password-file string Path of file containing basic auth password for helm repo\n --paused Create bundles in a paused state\n -a, --service-account string Service account to assign to bundle created\n --ssh-privatekey-file string Path of ssh-private-key for helm repo\n --sync-generation int Generation number used to force sync the deployment\n --target-namespace string Ensure this bundle goes to this target namespace\n --targets-file string Addition source of targets and restrictions to be append\n --username string Basic auth username for helm repo\n")),(0,l.yg)("h3",{id:"options-inherited-from-parent-commands"},"Options inherited from parent commands"),(0,l.yg)("pre",null,(0,l.yg)("code",{parentName:"pre"},' --context string kubeconfig context for authentication\n -k, --kubeconfig string kubeconfig for authentication\n -n, --namespace string namespace (default "fleet-local")\n --system-namespace string System namespace of the controller (default "cattle-fleet-system")\n')),(0,l.yg)("h3",{id:"see-also"},"SEE ALSO"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"./fleet"},"fleet"),"\t -")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fe8cb35a.8f5e5ea4.js b/assets/js/fe8cb35a.8f5e5ea4.js new file mode 100644 index 000000000..1a17c35bb --- /dev/null +++ b/assets/js/fe8cb35a.8f5e5ea4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[7060],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>g});var r=n(6540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||l;return n?r.createElement(g,a(a({ref:t},p),{},{components:n})):r.createElement(g,a({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:o,a[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(8168),o=(n(6540),n(5680));const l={},a="Bundle Lifecycle",i={unversionedId:"ref-bundle-stages",id:"version-0.7/ref-bundle-stages",title:"Bundle Lifecycle",description:"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.",source:"@site/versioned_docs/version-0.7/ref-bundle-stages.md",sourceDirName:".",slug:"/ref-bundle-stages",permalink:"/0.7/ref-bundle-stages",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/versioned_docs/version-0.7/ref-bundle-stages.md",tags:[],version:"0.7",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/0.7/concepts"},next:{title:"Git Repository Contents",permalink:"/0.7/gitrepo-content"}},s={},c=[],p={toc:c},u="wrapper";function d(e){let{components:t,...l}=e;return(0,o.yg)(u,(0,r.A)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"bundle-lifecycle"},"Bundle Lifecycle"),(0,o.yg)("p",null,"A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles."),(0,o.yg)("p",null,"To demonstrate the life cycle of a Fleet bundle, we will use ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet-examples/tree/master/multi-cluster/helm"},"multi-cluster/helm")," as a case study."),(0,o.yg)("ol",null,(0,o.yg)("li",{parentName:"ol"},"User will create a ",(0,o.yg)("a",{parentName:"li",href:"/0.7/gitrepo-add#create-gitrepo-instance"},"GitRepo")," that points to the multi-cluster/helm repository."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will sync changes from the GitRepo and detect changes from the polling or ",(0,o.yg)("a",{parentName:"li",href:"/0.7/webhook"},"webhook event"),". With every commit change, the ",(0,o.yg)("inlineCode",{parentName:"li"},"gitjob-controller")," will create a job that clones the git repository, reads content from the repo such as ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet.yaml")," and other manifests, and creates the Fleet ",(0,o.yg)("a",{parentName:"li",href:"/0.7/cluster-bundles-state#bundles"},"bundle"),".")),(0,o.yg)("blockquote",null,(0,o.yg)("p",{parentName:"blockquote"},(0,o.yg)("strong",{parentName:"p"},"Note:")," The job pod with the image name ",(0,o.yg)("inlineCode",{parentName:"p"},"rancher/tekton-utils")," will be under the same namespace as the GitRepo.")),(0,o.yg)("ol",{start:3},(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," then syncs changes from the bundle. According to the targets, the ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-controller")," will create ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," resources, which are a combination of a bundle and a target cluster."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will then pull the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," from the Fleet controlplane. The agent deploys bundle manifests as a ",(0,o.yg)("a",{parentName:"li",href:"https://helm.sh/docs/intro/install/"},"Helm chart")," from the ",(0,o.yg)("inlineCode",{parentName:"li"},"BundleDeployment")," into the downstream clusters."),(0,o.yg)("li",{parentName:"ol"},"The ",(0,o.yg)("inlineCode",{parentName:"li"},"fleet-agent")," will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.")),(0,o.yg)("p",null,"This diagram shows the different rendering stages a bundle goes through until deployment."),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"Bundle Stages",src:n(9561).A,width:"719",height:"811"})))}d.isMDXComponent=!0},9561:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/FleetBundleStages-900b0623b70f16e5d1800ea59245458a.svg"}}]); \ No newline at end of file diff --git a/assets/js/ffe5129d.4b3aa5ac.js b/assets/js/ffe5129d.4b3aa5ac.js new file mode 100644 index 000000000..d9d41116a --- /dev/null +++ b/assets/js/ffe5129d.4b3aa5ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8007],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),g=l,m=p["".concat(s,".").concat(g)]||p[g]||f[g]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=g;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/docs/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-configuration.md",tags:[],version:"current",lastUpdatedAt:1728640327,formattedLastUpdatedAt:"Oct 11, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/internal/config/config.go#L57"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-id=")," - The shard ID of a fleet controller pod."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-default=true")," - true if this is the controller managing resources without a shard reference label."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-ref=")," - references the Shard ID assigned by\nFleet to resources, inherited from a ",(0,l.yg)("inlineCode",{parentName:"li"},"GitRepo"),", which determines which Fleet controller deployment will reconcile them.",(0,l.yg)("ul",{parentName:"li"},(0,l.yg)("li",{parentName:"ul"},"If this label is not provided or has an empty value, then the unsharded Fleet controller will process the resource."),(0,l.yg)("li",{parentName:"ul"},"If this label has a value which does not match any shard ID for which a Fleet controller is deployed, then the\nresource will not be processed.")))),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ffe5129d.7ee5577f.js b/assets/js/ffe5129d.7ee5577f.js deleted file mode 100644 index 9632e95b5..000000000 --- a/assets/js/ffe5129d.7ee5577f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfleet_docs=self.webpackChunkfleet_docs||[]).push([[8007],{5680:(e,t,n)=>{n.d(t,{xA:()=>u,yg:()=>m});var a=n(6540);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),g=l,m=p["".concat(s,".").concat(g)]||p[g]||f[g]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=g;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:l,i[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var a=n(8168),l=(n(6540),n(5680));const r={},i="Configuration",o={unversionedId:"ref-configuration",id:"ref-configuration",title:"Configuration",description:"A reference list of, mostly internal, configuration options.",source:"@site/docs/ref-configuration.md",sourceDirName:".",slug:"/ref-configuration",permalink:"/ref-configuration",draft:!1,editUrl:"https://github.com/rancher/fleet-docs/edit/main/docs/ref-configuration.md",tags:[],version:"current",lastUpdatedAt:1727859583,formattedLastUpdatedAt:"Oct 2, 2024",frontMatter:{},sidebar:"docs",previous:{title:"Cluster Registration Internals",permalink:"/ref-registration"},next:{title:"List of Deployed Resources",permalink:"/ref-resources"}},s={},c=[{value:"Helm Charts",id:"helm-charts",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Configuration",id:"configuration-1",level:2},{value:"Labels",id:"labels",level:2},{value:"Annotations",id:"annotations",level:2},{value:"Fleet agent configuration",id:"fleet-agent-configuration",level:2}],u={toc:c},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.yg)(p,(0,a.A)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.yg)("h1",{id:"configuration"},"Configuration"),(0,l.yg)("p",null,"A reference list of, mostly internal, configuration options."),(0,l.yg)("h2",{id:"helm-charts"},"Helm Charts"),(0,l.yg)("p",null,"The Helm charts accept, at least, the options as shown with their default in ",(0,l.yg)("inlineCode",{parentName:"p"},"values.yaml"),":"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-crd/values.yaml")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"},"https://github.com/rancher/fleet/blob/main/charts/fleet-agent/values.yaml"))),(0,l.yg)("h2",{id:"environment-variables"},"Environment Variables"),(0,l.yg)("p",null,"The controllers can be started with these environment variables:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"CATTLE_DEV_MODE")," - used to debug wrangler, not usable"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CLUSTER_ENQUEUE_DELAY")," - tune how often non-ready clusters are checked"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"FLEET_CPU_PPROF_PERIOD")," - used to turn on ",(0,l.yg)("a",{parentName:"li",href:"https://github.com/rancher/fleet/blob/main/docs/performance.md"},"performance profiling"))),(0,l.yg)("h2",{id:"configuration-1"},"Configuration"),(0,l.yg)("p",null,"In cluster configuration for the agent and fleet manager. Changing these can lead to full re-deployments."),(0,l.yg)("p",null,"The config ",(0,l.yg)("a",{parentName:"p",href:"https://github.com/rancher/fleet/blob/main/internal/config/config.go#L57"},"struct")," is used in both config maps:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-agent"),(0,l.yg)("li",{parentName:"ul"},"cattle-fleet-system/fleet-controller")),(0,l.yg)("h2",{id:"labels"},"Labels"),(0,l.yg)("p",null,"Labels used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent=true")," - NodeSelector label for agent's deployment affinity setting"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/non-managed-agent")," - managed agent bundle won't target Clusters with this label"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/repo-name")," - used on Bundle to reference the git repo resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-namespace")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-name")," - used on BundleDeployment to reference the Bundle resource"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed=true")," - cluster namespaces with this label will be cleaned up. Other resources will be cleaned up if it is in a label. Used in Rancher to identify fleet namespaces."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bootstrap-token")," - unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-id=")," - The shard ID of a fleet controller pod."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-default=true")," - true if this is the controller managing resources without a shard reference label."),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/shard-ref=")," - references the Shard ID assigned by\nFleet to resources, inherited from a ",(0,l.yg)("inlineCode",{parentName:"li"},"GitRepo"),", which determines which Fleet controller deployment will reconcile them.",(0,l.yg)("ul",{parentName:"li"},(0,l.yg)("li",{parentName:"ul"},"If this label is not provided or has an empty value, then the unsharded Fleet controller will process the resource."),(0,l.yg)("li",{parentName:"ul"},"If this label has a value which does not match any shard ID for which a Fleet controller is deployed, then the\nresource will not be processed.")))),(0,l.yg)("h2",{id:"annotations"},"Annotations"),(0,l.yg)("p",null,"Annotations used by fleet:"),(0,l.yg)("ul",null,(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/agent-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/bundle-id")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster"),", ",(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-namespace")," - used on a cluster namespace to reference the cluster registration namespace and cluster name"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-group")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration-namespace")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/cluster-registration")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/commit")),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/managed")," - appears unused"),(0,l.yg)("li",{parentName:"ul"},(0,l.yg)("inlineCode",{parentName:"li"},"fleet.cattle.io/service-account"))),(0,l.yg)("h2",{id:"fleet-agent-configuration"},"Fleet agent configuration"),(0,l.yg)("p",null,"Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a\n",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/ref-crds#clusterspec"},"Cluster"),", see ",(0,l.yg)("a",{parentName:"p",href:"https://fleet.rancher.io/cluster-registration"},"Registering Downstream Cluster")," for more info on how to create\nClusters. Default configuration will be used if these fields are not provided."),(0,l.yg)("p",null,"If you change the resources limits, make sure the limits allow the fleet-agent to work normally."),(0,l.yg)("p",null,"Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults.\nAgents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.ca31abb0.js b/assets/js/runtime~main.d2e6c0ad.js similarity index 72% rename from assets/js/runtime~main.ca31abb0.js rename to assets/js/runtime~main.d2e6c0ad.js index 2777a207d..aac36161a 100644 --- a/assets/js/runtime~main.ca31abb0.js +++ b/assets/js/runtime~main.d2e6c0ad.js @@ -1 +1 @@ -(()=>{"use strict";var e,f,d,c,b,a={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return a[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=a,r.c=t,e=[],r.O=(f,d,c,b)=>{if(!d){var a=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[d,c,b]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var a={};f=f||[null,d({}),d([]),d(d)];for(var t=2&c&&e;"object"==typeof t&&!~f.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((f=>a[f]=()=>e[f]));return a.default=()=>e,r.d(b,a),b},r.d=(e,f)=>{for(var d in f)r.o(f,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:f[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,d)=>(r.f[d](e,f),f)),[])),r.u=e=>"assets/js/"+({40:"c916adcd",67:"6e869bec",76:"75201aa0",107:"f8909550",108:"916f8434",166:"1cb1b893",267:"b283d2e2",333:"d48f7c02",342:"89c8e819",356:"20889235",396:"033231c2",437:"984cdf04",446:"1bd61b9d",456:"fb76c575",476:"60bcd92c",501:"0209d9e7",610:"904bb95d",627:"28ebbdc0",662:"0a433e14",675:"612623d2",682:"a06c6d5b",783:"750cf41f",871:"2c86db16",883:"2d618eff",984:"568472e2",1040:"2f0f344d",1074:"8eb509d6",1091:"46c9c1f8",1144:"fd06576e",1254:"b60b3bd8",1285:"157d7e96",1292:"300dc0ad",1430:"62bbc60f",1471:"62061bdc",1489:"6417316b",1526:"b2dbf4a6",1529:"24a8fd1b",1544:"d9b00040",1572:"17b50570",1591:"857d18b5",1595:"e89d2f4d",1599:"95a72457",1662:"909a121f",1685:"e6339806",1694:"0acb2694",1747:"5b7f8ae0",1943:"f347fdc1",2008:"64b4770e",2042:"d0436963",2055:"7a815aed",2086:"6349fbc0",2089:"f63438e5",2138:"1a4e3797",2148:"f531b716",2194:"718ca91c",2239:"610ec0b5",2276:"3d725b75",2298:"2ab8e7e7",2299:"60c2c817",2312:"c3dfc33d",2343:"250ffcdd",2388:"ab0c1f88",2404:"b7ae13b2",2436:"963c03f5",2439:"cd323ffc",2443:"5281b7a2",2540:"f1a2b4e4",2547:"b32c755c",2589:"7292ec22",2596:"07db75e5",2601:"2a9b5780",2610:"3a2a2cbe",2640:"d26595bf",2648:"5388fcb8",2673:"b753e7fe",2722:"32a14031",2772:"a9e7f6cd",2805:"ab0ef0e3",2811:"0db4760e",2832:"34c1e1e7",2833:"7f3d36ad",2891:"14d1d990",2904:"cce49c68",2931:"3d7b86e7",2942:"e431d4ee",2963:"7b64d2e8",2973:"e6bd2de8",3051:"d8f58335",3081:"ebf52154",3105:"d53097a5",3160:"e50ee9c3",3165:"01681239",3190:"f59af033",3236:"aee07340",3242:"93002d83",3247:"6c233221",3277:"c3dc158a",3333:"ae2335f3",3342:"efdff6b0",3390:"680ed9ed",3441:"340d0560",3484:"e1252df2",3525:"5176c92e",3547:"c234ba49",3561:"0e3fdb5a",3615:"420e9d8d",3636:"e252aa27",3685:"f78aef8c",3733:"97d7d53e",3743:"8ff6a575",3747:"f6748474",3795:"d362fc0b",3812:"9d91368e",3813:"a8ca5d11",3822:"8070e160",3839:"f0907b6d",3840:"922074e2",3851:"dfa3dc49",3860:"d277059e",3888:"b9a03c38",3898:"32c7bf40",3908:"da21831e",3987:"f060f65c",4e3:"45a5cd1f",4021:"9fc6df8f",4044:"cf6f5f9b",4129:"a60f0c4b",4174:"095d9053",4195:"0f38f188",4266:"fbcf914d",4269:"126a9cd0",4282:"fbaf079d",4328:"5a165616",4378:"58cc1d6e",4395:"ab68c950",4537:"cd3b874c",4567:"5979dd46",4646:"7c4790a0",4654:"8c1e922c",4665:"cd5efc4d",4693:"c6aa770e",4697:"e3aa6547",4708:"ec9fa214",4714:"41b31679",4717:"0a06c365",4726:"e483f3c9",4731:"f94f0fba",4786:"ae10697b",4836:"c107a2c8",4963:"7712976a",5002:"9dcacd54",5039:"dd67116e",5103:"fe67fe92",5116:"96465f27",5149:"6638db74",5153:"12f4838b",5167:"c1b42080",5174:"0252b8ff",5197:"09dedfdd",5198:"87469ac3",5203:"6cbe47eb",5223:"246340c6",5251:"b8f3160f",5277:"c67695e7",5311:"34eb4307",5316:"39f5e362",5320:"1f330703",5321:"aba71817",5400:"f8113afe",5411:"4177aba1",5413:"522d95f1",5439:"702cd497",5463:"b2456c44",5554:"bd465781",5564:"75f6c082",5725:"2938f7a2",5742:"c377a04b",5790:"abf95bb4",5801:"69dd637e",5847:"b45da50c",5899:"c1900591",5901:"2ad17f29",5926:"c3dc2396",5958:"235236aa",5964:"834808ff",5987:"dd81469d",6026:"e9efc8c6",6051:"5b0cdfa3",6063:"635f26b6",6068:"77b9c036",6081:"b0423865",6094:"77fc540a",6124:"d2e22918",6161:"7c5d32d8",6176:"e9be1565",6233:"bcd76598",6291:"4e63d43a",6368:"de69e49e",6395:"8003b96f",6447:"97c3cd43",6452:"50b0676a",6481:"afc4945b",6506:"fd60c3a8",6511:"a947fe06",6652:"53da1243",6673:"c778489f",6677:"de08e76e",6730:"847b3bc4",6762:"6a840bac",6793:"f2839486",6803:"3b8c55ea",6828:"762abe3e",6888:"372310f1",6942:"de6c661b",6945:"c2bab82f",6951:"6df7348f",7034:"18f4f7da",7060:"fe8cb35a",7069:"49af6a86",7148:"f4793a78",7161:"8307bb82",7200:"59785b52",7242:"5ff573a6",7248:"504a9fc5",7267:"d596b4b8",7275:"5379b7b3",7291:"1a00f7b1",7327:"f3d80b69",7363:"af48bdba",7371:"e15d65f4",7452:"ce48e831",7482:"6271ce2c",7484:"34a3c1ae",7492:"db0ebd24",7494:"07686352",7585:"bf20a2eb",7637:"f7cf1511",7640:"fd26103c",7651:"fa2a1a7c",7666:"ea61e9e9",7739:"08aff371",7791:"eb9f028f",7845:"e30200fb",8007:"ffe5129d",8016:"cd0bf424",8031:"6fe63dff",8034:"75753a1b",8042:"5fdf261e",8047:"e0636556",8068:"167e2e0a",8086:"65f1dd3d",8095:"f7c88408",8106:"2dc49bc9",8162:"c7381d34",8164:"22b369d5",8172:"11f54a6a",8175:"6e08701a",8249:"d3d9887a",8342:"82782dff",8351:"10f03480",8384:"e35f16a8",8389:"9c942e60",8396:"0ce1d2b6",8401:"17896441",8428:"d6daf0cc",8466:"0364e902",8471:"9533a6b7",8523:"778a7b8d",8529:"9e8ad6e8",8568:"53c8b813",8581:"935f2afb",8586:"a2c468b1",8607:"579c3ff9",8652:"f2761eee",8698:"755aca7b",8714:"1be78505",8720:"ce534227",8730:"6faa62d7",8805:"2579085f",8861:"e348fb9e",8875:"d8b566f1",8988:"0bd7b06f",8992:"af10d9fb",9013:"9d9f8394",9028:"4ccb6852",9042:"140acae8",9044:"21d02ecb",9047:"8cc21d50",9073:"d254ed97",9147:"0ab79735",9184:"e4b5e952",9204:"370ac30b",9211:"9db89767",9218:"e7acee98",9242:"3a0e6d91",9279:"6cf4c0df",9313:"1fec2b35",9370:"02d72f40",9425:"045f7301",9432:"d3d84dd8",9450:"01b4035b",9524:"e0fa3763",9612:"0e50cd4d",9679:"e3313a7e",9752:"4fac8f87",9769:"1f14308a",9777:"1f8b8b7b",9792:"1e7260bb",9794:"06df35bc",9795:"f14b6af8",9832:"88f3f33f",9894:"d0180ce2",9937:"c1eb0b52",9963:"ee0e1228",9980:"f66ef323",9995:"170989a3"}[e]||e)+"."+{40:"ab227425",67:"4b5be406",76:"aada6610",107:"6c92d6f4",108:"6c258757",166:"4ff3da0a",267:"2088cc2c",333:"20997617",342:"1d273cb0",356:"98aa2648",396:"60d4ca4d",416:"e393ef0a",437:"88c1f699",446:"25179d07",456:"cef46e98",476:"1d599654",501:"3f7fcbcb",610:"c9d9f169",627:"8ede376f",662:"d90ad6fc",675:"e0a8d91e",682:"597f0405",783:"ff932820",871:"62d00473",883:"e9d40b63",984:"acdc066b",1040:"71e14a2e",1074:"e1f559b3",1091:"df7f92fb",1144:"ebbbf5e7",1254:"fc23a8e9",1285:"bbd08bc5",1292:"25368bb2",1430:"6e3db6a2",1471:"3a5ec889",1489:"3cb8935c",1526:"7330e35e",1529:"0bf966a3",1544:"0bcf7daa",1572:"02f8a773",1591:"55032e63",1595:"63e3ba1d",1599:"a48f9e58",1662:"4273df39",1685:"57b9f2a1",1694:"7a4034f2",1747:"33ed0c75",1774:"51e961a1",1943:"f06b09de",2008:"d5f03359",2042:"4800e890",2055:"5b399829",2086:"d062d2e3",2089:"b0f6ea87",2138:"3ab1b7e7",2148:"8806dd95",2194:"21640fb5",2239:"0760d525",2276:"ab5aa125",2298:"ff254f93",2299:"7ed6a765",2312:"2230eaf7",2343:"4494df9e",2388:"71ba563b",2404:"4c0e3323",2436:"c7301bad",2439:"4cb1c396",2443:"14df710b",2540:"b126cfcb",2547:"686ca006",2589:"f4eadcf7",2596:"c45840b7",2601:"8c8bf1e5",2610:"29f463ed",2640:"0d18e311",2648:"f6eab35b",2673:"12920716",2722:"12542692",2772:"41b56d6d",2805:"57658d16",2811:"f192c84d",2832:"2da037ef",2833:"2a79621b",2891:"15ff1d72",2904:"90201edf",2931:"9c6033fa",2942:"bbecd114",2963:"42866e66",2973:"8e479b82",3051:"6a60e297",3081:"44e244a3",3105:"bd5f0777",3160:"35e47d55",3165:"5c78b2fc",3190:"5ae364a3",3236:"91e2c758",3242:"849fd77a",3247:"f74208a2",3277:"9e3b9ccf",3282:"c0c93da1",3333:"237ea590",3342:"c6547572",3390:"922cdd36",3441:"9f543b39",3484:"9822c52a",3525:"dede99c9",3547:"769a2190",3561:"8a3be9fd",3615:"790b844c",3636:"ac78d18e",3685:"9115d56d",3733:"a6e52dc0",3743:"4a820fcb",3747:"8410cf7d",3795:"1f6f5b96",3812:"b4ba518e",3813:"4cbcaf70",3822:"cf2998dd",3839:"f74ba205",3840:"22dbfe29",3851:"23fe8ce9",3860:"13e4ce80",3888:"17f93d5d",3898:"8631f097",3908:"db18ec44",3987:"78c65e31",4e3:"18b5f71f",4021:"0b3f329e",4044:"ac2bea58",4129:"ef4e89c8",4174:"fb1e3983",4195:"58ab694b",4266:"7e6d10e5",4269:"25e10f3a",4282:"ee95f6dd",4328:"4ee17e7c",4378:"dc050fa7",4395:"b1678092",4537:"4e2537a2",4567:"9cbbbdb3",4646:"1ef933ce",4654:"ff714f63",4665:"7e4a0f06",4693:"4202ec9b",4697:"d3e047a0",4708:"4e0529b3",4714:"116dff97",4717:"5f142215",4726:"cb334c3a",4731:"cc86722b",4786:"3d8b04dc",4836:"8697997e",4963:"adb6b8c4",5002:"6d946ed1",5039:"c5edf10a",5103:"f3912112",5116:"41497b52",5149:"a71e6b97",5153:"3083aa03",5167:"f25e3568",5174:"ffa0298b",5197:"3c286234",5198:"c8a2b7e7",5203:"db5bec14",5223:"e60e56de",5251:"162a2ca5",5277:"4f1d0191",5311:"dd0cd695",5316:"cffb2814",5320:"bc1898dd",5321:"2f7243e2",5400:"c16ff6d2",5411:"3a2cab36",5413:"81b01479",5439:"126a0392",5463:"81fad92a",5554:"235595eb",5564:"72e3baec",5725:"da4aa6ed",5742:"3401eb9c",5790:"421c137b",5801:"1794c41d",5847:"d8383617",5899:"629b8b88",5901:"1f2a4882",5926:"5ce1edd4",5958:"128b6fd9",5964:"8a3d2630",5987:"b2e8d02d",6026:"19803041",6051:"805fb58e",6063:"9ac74d6d",6068:"6e6791a4",6081:"b57540ef",6094:"b43f2288",6124:"c7b606f9",6161:"3918bcd7",6176:"f7033012",6233:"77718dd0",6291:"16c5ee57",6368:"b0af1a34",6395:"d8d831b0",6447:"49666ba8",6452:"9fc2865f",6481:"011eff76",6506:"8af593db",6511:"a3a8aac7",6652:"e238c149",6673:"36c2cc19",6677:"a63920b8",6730:"36a1003a",6762:"23d5dcbf",6793:"3231dd8e",6803:"b2937e87",6828:"7288f686",6888:"103b891b",6942:"43b4fb8a",6945:"48e4aad3",6951:"ee8ae7c6",7034:"f4776356",7060:"d6dd6984",7069:"a7197f9f",7148:"96d20daa",7161:"e7c3a6cb",7200:"1998055a",7242:"e3348b2d",7248:"c559205d",7267:"b6cd200d",7275:"41859903",7291:"eee72c3a",7327:"5c32913e",7363:"2e5f46f8",7371:"c9e8e7d9",7452:"6c875db7",7482:"bd29b6c7",7484:"3cc5a4ec",7492:"3c6cdcd6",7494:"8c5ab4b8",7585:"e6610e37",7637:"26fdaa67",7640:"94d66cdf",7651:"8b4232a9",7666:"d5b15998",7739:"feec1fe2",7791:"9e1b0393",7845:"87f83b5e",8007:"7ee5577f",8016:"25a59026",8031:"3a08d81c",8034:"353de92e",8042:"8b5c5f30",8047:"e3f1aea1",8068:"e7f44ca9",8086:"0ff856cf",8095:"4e93ee69",8106:"4463ba25",8158:"c3368daa",8162:"ab487e8b",8164:"10a66fd1",8172:"946c3aa6",8175:"0eb1ec90",8249:"fae0bd06",8342:"ca5bf7a4",8351:"e81d66d6",8384:"780a0a97",8389:"6a2ab07b",8396:"2b960978",8401:"08772d4d",8428:"a14d4afc",8466:"7f40923a",8471:"3923ebe7",8523:"d9280ad7",8529:"fa0bea58",8568:"9f3df9bb",8581:"6f8c9ed1",8586:"ee780342",8607:"cd359614",8652:"06aad8bf",8698:"c43c05f6",8714:"f5238336",8720:"f2af98c0",8730:"0a684579",8805:"e69fe60d",8861:"27397eca",8875:"6fa7d587",8913:"7192b719",8988:"c9f51c8c",8992:"5cc8409a",9013:"f8091fe4",9028:"262cc6a1",9042:"bcf5605b",9044:"56c6e1d1",9047:"fead5b54",9073:"b749d91e",9147:"5b238ed7",9184:"02309ac9",9204:"2c6f0742",9211:"868f644a",9218:"c0d81965",9242:"8fadd991",9279:"a9767a20",9313:"19b5f491",9370:"92ac8c83",9425:"ebabec62",9432:"b0b8c899",9450:"377c6de8",9524:"83f71946",9612:"7f27c46a",9679:"51086e7f",9752:"ea7b58d9",9769:"2cfdbadd",9777:"429da043",9792:"d8ec397a",9794:"81c7aa0b",9795:"758a893a",9832:"a803775c",9894:"c2646e02",9937:"25853f9d",9963:"132137d0",9980:"7afde34f",9995:"b521ad2d"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),c={},b="fleet-docs:",r.l=(e,f,d,a)=>{if(c[e])c[e].push(f);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(d))),f)return f(d)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",20889235:"356",c916adcd:"40","6e869bec":"67","75201aa0":"76",f8909550:"107","916f8434":"108","1cb1b893":"166",b283d2e2:"267",d48f7c02:"333","89c8e819":"342","033231c2":"396","984cdf04":"437","1bd61b9d":"446",fb76c575:"456","60bcd92c":"476","0209d9e7":"501","904bb95d":"610","28ebbdc0":"627","0a433e14":"662","612623d2":"675",a06c6d5b:"682","750cf41f":"783","2c86db16":"871","2d618eff":"883","568472e2":"984","2f0f344d":"1040","8eb509d6":"1074","46c9c1f8":"1091",fd06576e:"1144",b60b3bd8:"1254","157d7e96":"1285","300dc0ad":"1292","62bbc60f":"1430","62061bdc":"1471","6417316b":"1489",b2dbf4a6:"1526","24a8fd1b":"1529",d9b00040:"1544","17b50570":"1572","857d18b5":"1591",e89d2f4d:"1595","95a72457":"1599","909a121f":"1662",e6339806:"1685","0acb2694":"1694","5b7f8ae0":"1747",f347fdc1:"1943","64b4770e":"2008",d0436963:"2042","7a815aed":"2055","6349fbc0":"2086",f63438e5:"2089","1a4e3797":"2138",f531b716:"2148","718ca91c":"2194","610ec0b5":"2239","3d725b75":"2276","2ab8e7e7":"2298","60c2c817":"2299",c3dfc33d:"2312","250ffcdd":"2343",ab0c1f88:"2388",b7ae13b2:"2404","963c03f5":"2436",cd323ffc:"2439","5281b7a2":"2443",f1a2b4e4:"2540",b32c755c:"2547","7292ec22":"2589","07db75e5":"2596","2a9b5780":"2601","3a2a2cbe":"2610",d26595bf:"2640","5388fcb8":"2648",b753e7fe:"2673","32a14031":"2722",a9e7f6cd:"2772",ab0ef0e3:"2805","0db4760e":"2811","34c1e1e7":"2832","7f3d36ad":"2833","14d1d990":"2891",cce49c68:"2904","3d7b86e7":"2931",e431d4ee:"2942","7b64d2e8":"2963",e6bd2de8:"2973",d8f58335:"3051",ebf52154:"3081",d53097a5:"3105",e50ee9c3:"3160","01681239":"3165",f59af033:"3190",aee07340:"3236","93002d83":"3242","6c233221":"3247",c3dc158a:"3277",ae2335f3:"3333",efdff6b0:"3342","680ed9ed":"3390","340d0560":"3441",e1252df2:"3484","5176c92e":"3525",c234ba49:"3547","0e3fdb5a":"3561","420e9d8d":"3615",e252aa27:"3636",f78aef8c:"3685","97d7d53e":"3733","8ff6a575":"3743",f6748474:"3747",d362fc0b:"3795","9d91368e":"3812",a8ca5d11:"3813","8070e160":"3822",f0907b6d:"3839","922074e2":"3840",dfa3dc49:"3851",d277059e:"3860",b9a03c38:"3888","32c7bf40":"3898",da21831e:"3908",f060f65c:"3987","45a5cd1f":"4000","9fc6df8f":"4021",cf6f5f9b:"4044",a60f0c4b:"4129","095d9053":"4174","0f38f188":"4195",fbcf914d:"4266","126a9cd0":"4269",fbaf079d:"4282","5a165616":"4328","58cc1d6e":"4378",ab68c950:"4395",cd3b874c:"4537","5979dd46":"4567","7c4790a0":"4646","8c1e922c":"4654",cd5efc4d:"4665",c6aa770e:"4693",e3aa6547:"4697",ec9fa214:"4708","41b31679":"4714","0a06c365":"4717",e483f3c9:"4726",f94f0fba:"4731",ae10697b:"4786",c107a2c8:"4836","7712976a":"4963","9dcacd54":"5002",dd67116e:"5039",fe67fe92:"5103","96465f27":"5116","6638db74":"5149","12f4838b":"5153",c1b42080:"5167","0252b8ff":"5174","09dedfdd":"5197","87469ac3":"5198","6cbe47eb":"5203","246340c6":"5223",b8f3160f:"5251",c67695e7:"5277","34eb4307":"5311","39f5e362":"5316","1f330703":"5320",aba71817:"5321",f8113afe:"5400","4177aba1":"5411","522d95f1":"5413","702cd497":"5439",b2456c44:"5463",bd465781:"5554","75f6c082":"5564","2938f7a2":"5725",c377a04b:"5742",abf95bb4:"5790","69dd637e":"5801",b45da50c:"5847",c1900591:"5899","2ad17f29":"5901",c3dc2396:"5926","235236aa":"5958","834808ff":"5964",dd81469d:"5987",e9efc8c6:"6026","5b0cdfa3":"6051","635f26b6":"6063","77b9c036":"6068",b0423865:"6081","77fc540a":"6094",d2e22918:"6124","7c5d32d8":"6161",e9be1565:"6176",bcd76598:"6233","4e63d43a":"6291",de69e49e:"6368","8003b96f":"6395","97c3cd43":"6447","50b0676a":"6452",afc4945b:"6481",fd60c3a8:"6506",a947fe06:"6511","53da1243":"6652",c778489f:"6673",de08e76e:"6677","847b3bc4":"6730","6a840bac":"6762",f2839486:"6793","3b8c55ea":"6803","762abe3e":"6828","372310f1":"6888",de6c661b:"6942",c2bab82f:"6945","6df7348f":"6951","18f4f7da":"7034",fe8cb35a:"7060","49af6a86":"7069",f4793a78:"7148","8307bb82":"7161","59785b52":"7200","5ff573a6":"7242","504a9fc5":"7248",d596b4b8:"7267","5379b7b3":"7275","1a00f7b1":"7291",f3d80b69:"7327",af48bdba:"7363",e15d65f4:"7371",ce48e831:"7452","6271ce2c":"7482","34a3c1ae":"7484",db0ebd24:"7492","07686352":"7494",bf20a2eb:"7585",f7cf1511:"7637",fd26103c:"7640",fa2a1a7c:"7651",ea61e9e9:"7666","08aff371":"7739",eb9f028f:"7791",e30200fb:"7845",ffe5129d:"8007",cd0bf424:"8016","6fe63dff":"8031","75753a1b":"8034","5fdf261e":"8042",e0636556:"8047","167e2e0a":"8068","65f1dd3d":"8086",f7c88408:"8095","2dc49bc9":"8106",c7381d34:"8162","22b369d5":"8164","11f54a6a":"8172","6e08701a":"8175",d3d9887a:"8249","82782dff":"8342","10f03480":"8351",e35f16a8:"8384","9c942e60":"8389","0ce1d2b6":"8396",d6daf0cc:"8428","0364e902":"8466","9533a6b7":"8471","778a7b8d":"8523","9e8ad6e8":"8529","53c8b813":"8568","935f2afb":"8581",a2c468b1:"8586","579c3ff9":"8607",f2761eee:"8652","755aca7b":"8698","1be78505":"8714",ce534227:"8720","6faa62d7":"8730","2579085f":"8805",e348fb9e:"8861",d8b566f1:"8875","0bd7b06f":"8988",af10d9fb:"8992","9d9f8394":"9013","4ccb6852":"9028","140acae8":"9042","21d02ecb":"9044","8cc21d50":"9047",d254ed97:"9073","0ab79735":"9147",e4b5e952:"9184","370ac30b":"9204","9db89767":"9211",e7acee98:"9218","3a0e6d91":"9242","6cf4c0df":"9279","1fec2b35":"9313","02d72f40":"9370","045f7301":"9425",d3d84dd8:"9432","01b4035b":"9450",e0fa3763:"9524","0e50cd4d":"9612",e3313a7e:"9679","4fac8f87":"9752","1f14308a":"9769","1f8b8b7b":"9777","1e7260bb":"9792","06df35bc":"9794",f14b6af8:"9795","88f3f33f":"9832",d0180ce2:"9894",c1eb0b52:"9937",ee0e1228:"9963",f66ef323:"9980","170989a3":"9995"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(f,d)=>{var c=r.o(e,f)?e[f]:void 0;if(0!==c)if(c)d.push(c[2]);else if(/^(1869|5354)$/.test(f))e[f]=0;else{var b=new Promise(((d,b)=>c=e[f]=[d,b]));d.push(c[2]=b);var a=r.p+r.u(f),t=new Error;r.l(a,(d=>{if(r.o(e,f)&&(0!==(c=e[f])&&(e[f]=void 0),c)){var b=d&&("load"===d.type?"missing":d.type),a=d&&d.target&&d.target.src;t.message="Loading chunk "+f+" failed.\n("+b+": "+a+")",t.name="ChunkLoadError",t.type=b,t.request=a,c[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,d)=>{var c,b,a=d[0],t=d[1],o=d[2],n=0;if(a.some((f=>0!==e[f]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(f&&f(d);n{"use strict";var e,f,d,c,b,a={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return a[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=a,r.c=t,e=[],r.O=(f,d,c,b)=>{if(!d){var a=1/0;for(i=0;i=b)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[d,c,b]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var a={};f=f||[null,d({}),d([]),d(d)];for(var t=2&c&&e;"object"==typeof t&&!~f.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((f=>a[f]=()=>e[f]));return a.default=()=>e,r.d(b,a),b},r.d=(e,f)=>{for(var d in f)r.o(f,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:f[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,d)=>(r.f[d](e,f),f)),[])),r.u=e=>"assets/js/"+({40:"c916adcd",67:"6e869bec",76:"75201aa0",107:"f8909550",108:"916f8434",166:"1cb1b893",267:"b283d2e2",333:"d48f7c02",342:"89c8e819",356:"20889235",396:"033231c2",437:"984cdf04",446:"1bd61b9d",456:"fb76c575",476:"60bcd92c",501:"0209d9e7",610:"904bb95d",627:"28ebbdc0",662:"0a433e14",675:"612623d2",682:"a06c6d5b",783:"750cf41f",871:"2c86db16",883:"2d618eff",984:"568472e2",1040:"2f0f344d",1074:"8eb509d6",1091:"46c9c1f8",1144:"fd06576e",1254:"b60b3bd8",1285:"157d7e96",1292:"300dc0ad",1430:"62bbc60f",1471:"62061bdc",1489:"6417316b",1526:"b2dbf4a6",1529:"24a8fd1b",1544:"d9b00040",1572:"17b50570",1591:"857d18b5",1595:"e89d2f4d",1599:"95a72457",1662:"909a121f",1685:"e6339806",1694:"0acb2694",1747:"5b7f8ae0",1943:"f347fdc1",2008:"64b4770e",2042:"d0436963",2055:"7a815aed",2086:"6349fbc0",2089:"f63438e5",2138:"1a4e3797",2148:"f531b716",2194:"718ca91c",2239:"610ec0b5",2276:"3d725b75",2298:"2ab8e7e7",2299:"60c2c817",2312:"c3dfc33d",2343:"250ffcdd",2388:"ab0c1f88",2404:"b7ae13b2",2436:"963c03f5",2439:"cd323ffc",2443:"5281b7a2",2540:"f1a2b4e4",2547:"b32c755c",2589:"7292ec22",2596:"07db75e5",2601:"2a9b5780",2610:"3a2a2cbe",2640:"d26595bf",2648:"5388fcb8",2673:"b753e7fe",2722:"32a14031",2772:"a9e7f6cd",2805:"ab0ef0e3",2811:"0db4760e",2832:"34c1e1e7",2833:"7f3d36ad",2891:"14d1d990",2904:"cce49c68",2931:"3d7b86e7",2942:"e431d4ee",2963:"7b64d2e8",2973:"e6bd2de8",3051:"d8f58335",3081:"ebf52154",3105:"d53097a5",3160:"e50ee9c3",3165:"01681239",3190:"f59af033",3236:"aee07340",3242:"93002d83",3247:"6c233221",3277:"c3dc158a",3333:"ae2335f3",3342:"efdff6b0",3390:"680ed9ed",3441:"340d0560",3484:"e1252df2",3525:"5176c92e",3547:"c234ba49",3561:"0e3fdb5a",3615:"420e9d8d",3636:"e252aa27",3685:"f78aef8c",3733:"97d7d53e",3743:"8ff6a575",3747:"f6748474",3795:"d362fc0b",3812:"9d91368e",3813:"a8ca5d11",3822:"8070e160",3839:"f0907b6d",3840:"922074e2",3851:"dfa3dc49",3860:"d277059e",3888:"b9a03c38",3898:"32c7bf40",3908:"da21831e",3987:"f060f65c",4e3:"45a5cd1f",4021:"9fc6df8f",4044:"cf6f5f9b",4129:"a60f0c4b",4174:"095d9053",4195:"0f38f188",4266:"fbcf914d",4269:"126a9cd0",4282:"fbaf079d",4328:"5a165616",4378:"58cc1d6e",4395:"ab68c950",4537:"cd3b874c",4567:"5979dd46",4646:"7c4790a0",4654:"8c1e922c",4665:"cd5efc4d",4693:"c6aa770e",4697:"e3aa6547",4708:"ec9fa214",4714:"41b31679",4717:"0a06c365",4726:"e483f3c9",4731:"f94f0fba",4786:"ae10697b",4836:"c107a2c8",4963:"7712976a",5002:"9dcacd54",5039:"dd67116e",5103:"fe67fe92",5116:"96465f27",5149:"6638db74",5153:"12f4838b",5167:"c1b42080",5174:"0252b8ff",5197:"09dedfdd",5198:"87469ac3",5203:"6cbe47eb",5223:"246340c6",5251:"b8f3160f",5277:"c67695e7",5311:"34eb4307",5316:"39f5e362",5320:"1f330703",5321:"aba71817",5400:"f8113afe",5411:"4177aba1",5413:"522d95f1",5439:"702cd497",5463:"b2456c44",5554:"bd465781",5564:"75f6c082",5725:"2938f7a2",5742:"c377a04b",5790:"abf95bb4",5801:"69dd637e",5847:"b45da50c",5899:"c1900591",5901:"2ad17f29",5926:"c3dc2396",5958:"235236aa",5964:"834808ff",5987:"dd81469d",6026:"e9efc8c6",6051:"5b0cdfa3",6063:"635f26b6",6068:"77b9c036",6081:"b0423865",6094:"77fc540a",6124:"d2e22918",6161:"7c5d32d8",6176:"e9be1565",6233:"bcd76598",6291:"4e63d43a",6368:"de69e49e",6395:"8003b96f",6447:"97c3cd43",6452:"50b0676a",6481:"afc4945b",6506:"fd60c3a8",6511:"a947fe06",6652:"53da1243",6673:"c778489f",6677:"de08e76e",6730:"847b3bc4",6762:"6a840bac",6793:"f2839486",6803:"3b8c55ea",6828:"762abe3e",6888:"372310f1",6942:"de6c661b",6945:"c2bab82f",6951:"6df7348f",7034:"18f4f7da",7060:"fe8cb35a",7069:"49af6a86",7148:"f4793a78",7161:"8307bb82",7200:"59785b52",7242:"5ff573a6",7248:"504a9fc5",7267:"d596b4b8",7275:"5379b7b3",7291:"1a00f7b1",7327:"f3d80b69",7363:"af48bdba",7371:"e15d65f4",7452:"ce48e831",7482:"6271ce2c",7484:"34a3c1ae",7492:"db0ebd24",7494:"07686352",7585:"bf20a2eb",7637:"f7cf1511",7640:"fd26103c",7651:"fa2a1a7c",7666:"ea61e9e9",7739:"08aff371",7791:"eb9f028f",7845:"e30200fb",8007:"ffe5129d",8016:"cd0bf424",8031:"6fe63dff",8034:"75753a1b",8042:"5fdf261e",8047:"e0636556",8068:"167e2e0a",8086:"65f1dd3d",8095:"f7c88408",8106:"2dc49bc9",8162:"c7381d34",8164:"22b369d5",8172:"11f54a6a",8175:"6e08701a",8249:"d3d9887a",8342:"82782dff",8351:"10f03480",8384:"e35f16a8",8389:"9c942e60",8396:"0ce1d2b6",8401:"17896441",8428:"d6daf0cc",8466:"0364e902",8471:"9533a6b7",8523:"778a7b8d",8529:"9e8ad6e8",8568:"53c8b813",8581:"935f2afb",8586:"a2c468b1",8607:"579c3ff9",8652:"f2761eee",8698:"755aca7b",8714:"1be78505",8720:"ce534227",8730:"6faa62d7",8805:"2579085f",8861:"e348fb9e",8875:"d8b566f1",8988:"0bd7b06f",8992:"af10d9fb",9013:"9d9f8394",9028:"4ccb6852",9042:"140acae8",9044:"21d02ecb",9047:"8cc21d50",9073:"d254ed97",9147:"0ab79735",9184:"e4b5e952",9204:"370ac30b",9211:"9db89767",9218:"e7acee98",9242:"3a0e6d91",9279:"6cf4c0df",9313:"1fec2b35",9370:"02d72f40",9425:"045f7301",9432:"d3d84dd8",9450:"01b4035b",9524:"e0fa3763",9612:"0e50cd4d",9679:"e3313a7e",9752:"4fac8f87",9769:"1f14308a",9777:"1f8b8b7b",9792:"1e7260bb",9794:"06df35bc",9795:"f14b6af8",9832:"88f3f33f",9894:"d0180ce2",9937:"c1eb0b52",9963:"ee0e1228",9980:"f66ef323",9995:"170989a3"}[e]||e)+"."+{40:"f5addf4e",67:"51f9442c",76:"4ea39a09",107:"d641e0c4",108:"a5766fc4",166:"35738093",267:"c136e0bb",333:"51913f73",342:"21d90e3b",356:"47188a9e",396:"00f3176f",416:"e393ef0a",437:"dfe43337",446:"bf7f7775",456:"2b5ac70b",476:"7aa854a8",501:"484e2daa",610:"3f0187d2",627:"207f0f4a",662:"d90ad6fc",675:"b49aa2dc",682:"98baaf3e",783:"1386afd1",871:"2c2ff5aa",883:"39ae4d3d",984:"27a189ed",1040:"71e14a2e",1074:"a5303514",1091:"408360fc",1144:"b16bac86",1254:"47b79bbc",1285:"190215b4",1292:"3556dca1",1430:"a246f429",1471:"f6ce71f7",1489:"0a2d4f29",1526:"b099573b",1529:"62a25a58",1544:"681ceb82",1572:"02f8a773",1591:"172b8c15",1595:"82f3bac8",1599:"373c139f",1662:"2f5457ba",1685:"41cf0b18",1694:"b960ec4b",1747:"8d155bb1",1774:"51e961a1",1943:"ec8272ca",2008:"12698e3f",2042:"c72b3711",2055:"e21410e3",2086:"b24d35a0",2089:"4f3a87ed",2138:"3ab1b7e7",2148:"1dc7b4fc",2194:"bf9cdc4c",2239:"b448bd46",2276:"dd2722ad",2298:"bb86e1ce",2299:"9dc36e70",2312:"83be11dc",2343:"be2361d9",2388:"1110ee63",2404:"741f6962",2436:"9347ac22",2439:"376b6fd7",2443:"7b04cf3e",2540:"5d390d40",2547:"0a6037b5",2589:"78ba5043",2596:"7cb2cc57",2601:"2ce9ef51",2610:"477de2e4",2640:"c76f1ac2",2648:"280ab3c3",2673:"125f5b3b",2722:"e5603202",2772:"9ee6e728",2805:"f60d5079",2811:"f9dde841",2832:"26e36456",2833:"f1edd002",2891:"6136153b",2904:"13e27c91",2931:"0dc32e9f",2942:"5976e20f",2963:"156b6454",2973:"ac50b5e6",3051:"60e14460",3081:"854c4843",3105:"6e53adb9",3160:"0161833d",3165:"7ffdc0ea",3190:"f0402606",3236:"255d18c6",3242:"849fd77a",3247:"d6fcc8ad",3277:"20e2d1b7",3282:"c0c93da1",3333:"68b540ee",3342:"73a3f09e",3390:"833fdd7b",3441:"97702eb6",3484:"8157948f",3525:"4c30a87c",3547:"b3a9f1c4",3561:"46d42090",3615:"89b80f21",3636:"71a0ba2b",3685:"2cbdbda0",3733:"600916f3",3743:"c8aa30eb",3747:"b64af5f3",3795:"be9ece68",3812:"8746815c",3813:"c6a3fb64",3822:"b13b622e",3839:"9c1d969d",3840:"aa431441",3851:"733b25d5",3860:"86bdab2a",3888:"73be24d2",3898:"61ccaeda",3908:"871cf55c",3987:"2469a858",4e3:"4d3cb70a",4021:"d5ef2dcd",4044:"066b6e0a",4129:"6b2d4b69",4174:"a21252eb",4195:"9b4ae222",4266:"c8f66d08",4269:"de97e80e",4282:"f5b23e9a",4328:"1067c374",4378:"dc050fa7",4395:"550f2f45",4537:"d4ee4213",4567:"9cbbbdb3",4646:"13014248",4654:"c394b58c",4665:"aa9e9158",4693:"5f275bd1",4697:"f95e465e",4708:"df9bcc7f",4714:"11585cde",4717:"7310d13f",4726:"4067bbda",4731:"ee0f8da8",4786:"d29c1773",4836:"73562cc0",4963:"9bb3a52a",5002:"e45b7503",5039:"bb4e40b1",5103:"22432ad1",5116:"aa834614",5149:"a71e6b97",5153:"599de7ad",5167:"948218f7",5174:"0cdef481",5197:"749c18a6",5198:"84f69b9b",5203:"9c7051ba",5223:"10b9fcc4",5251:"a5448e54",5277:"ce05d240",5311:"3097c176",5316:"414ef944",5320:"18b38c65",5321:"6868c433",5400:"d31e74b0",5411:"a7a7fe2a",5413:"cebf3b17",5439:"ca2a7877",5463:"7ab8c2ae",5554:"02dc1c3d",5564:"c4286964",5725:"9b1f1da5",5742:"9b5d427f",5790:"c9c848fb",5801:"5ffd97c8",5847:"a1399b20",5899:"cce1dc69",5901:"028c104a",5926:"d57094ed",5958:"38aa7f81",5964:"001f7fac",5987:"bba2cbe1",6026:"a134beb3",6051:"0d938eef",6063:"e87fe39b",6068:"85ab0134",6081:"9580be7b",6094:"308ffc94",6124:"e7ea188a",6161:"e1221967",6176:"f0b6edce",6233:"1972e8f7",6291:"3d28a661",6368:"593f536e",6395:"9126ab3e",6447:"d6e480a1",6452:"d516f147",6481:"6645fc18",6506:"7f9d1bcd",6511:"7523aae4",6652:"441d4d38",6673:"e90256ca",6677:"a9a5d0a3",6730:"c5fe7a91",6762:"30c51ac3",6793:"b903b332",6803:"3a733d57",6828:"5b6319ae",6888:"c0c3c6e7",6942:"376d6e74",6945:"b073e09f",6951:"5a04837e",7034:"6b1d35eb",7060:"8f5e5ea4",7069:"0467fbcc",7148:"f8a4fde4",7161:"eb0440c2",7200:"25c1f12a",7242:"4a631956",7248:"b23a2dff",7267:"d7c0bc85",7275:"d4faf8db",7291:"ee7115b0",7327:"54687dd5",7363:"76e956a1",7371:"c8d0415b",7452:"17531819",7482:"63ab3cda",7484:"545ec266",7492:"334f1aab",7494:"09afe081",7585:"ffda737a",7637:"6acd508c",7640:"4afcb136",7651:"42c8ad3e",7666:"e46c0427",7739:"3e2739ee",7791:"d0eaab18",7845:"9eebf0ae",8007:"4b3aa5ac",8016:"0a6d877a",8031:"b68c9442",8034:"0c1da55e",8042:"23dace26",8047:"cf1accdb",8068:"bd83ff6c",8086:"0771566e",8095:"21d9faa2",8106:"ec9c2283",8158:"c3368daa",8162:"bc15fdb4",8164:"472193c7",8172:"d83cc3de",8175:"1b7a2315",8249:"272737d9",8342:"44878f5c",8351:"16f3129f",8384:"aa3288ae",8389:"c223a63a",8396:"b38d3f4d",8401:"08772d4d",8428:"4ec5410d",8466:"8225d539",8471:"14e38ec6",8523:"b38dab3f",8529:"ccc62409",8568:"69e29473",8581:"6f8c9ed1",8586:"961a67d7",8607:"c6c84f1e",8652:"d73a4ec7",8698:"13cf3bda",8714:"f5238336",8720:"030fd894",8730:"b5fdb549",8805:"99b330b2",8861:"e7a6b598",8875:"2a6621b8",8913:"7192b719",8988:"f9336e7f",8992:"a22cf0dc",9013:"17b5d278",9028:"6f82cf13",9042:"2926f0f1",9044:"69b6ee31",9047:"fcd06c2d",9073:"e56d43ab",9147:"e1d7be9e",9184:"851dd734",9204:"c1f02bf9",9211:"9717f697",9218:"b0bb1819",9242:"7c61044d",9279:"14db90db",9313:"26022808",9370:"274b233c",9425:"8731bbc1",9432:"534edb2d",9450:"8acc7875",9524:"8cc4f5ab",9612:"8175ca19",9679:"40608f99",9752:"bb392bce",9769:"bb5d5a3a",9777:"f8b991ed",9792:"bd148c1e",9794:"81c7aa0b",9795:"d08a654f",9832:"aadadc40",9894:"a210270a",9937:"3aadb6fb",9963:"132137d0",9980:"51b039e4",9995:"398c8cf3"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),c={},b="fleet-docs:",r.l=(e,f,d,a)=>{if(c[e])c[e].push(f);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach((e=>e(d))),f)return f(d)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",20889235:"356",c916adcd:"40","6e869bec":"67","75201aa0":"76",f8909550:"107","916f8434":"108","1cb1b893":"166",b283d2e2:"267",d48f7c02:"333","89c8e819":"342","033231c2":"396","984cdf04":"437","1bd61b9d":"446",fb76c575:"456","60bcd92c":"476","0209d9e7":"501","904bb95d":"610","28ebbdc0":"627","0a433e14":"662","612623d2":"675",a06c6d5b:"682","750cf41f":"783","2c86db16":"871","2d618eff":"883","568472e2":"984","2f0f344d":"1040","8eb509d6":"1074","46c9c1f8":"1091",fd06576e:"1144",b60b3bd8:"1254","157d7e96":"1285","300dc0ad":"1292","62bbc60f":"1430","62061bdc":"1471","6417316b":"1489",b2dbf4a6:"1526","24a8fd1b":"1529",d9b00040:"1544","17b50570":"1572","857d18b5":"1591",e89d2f4d:"1595","95a72457":"1599","909a121f":"1662",e6339806:"1685","0acb2694":"1694","5b7f8ae0":"1747",f347fdc1:"1943","64b4770e":"2008",d0436963:"2042","7a815aed":"2055","6349fbc0":"2086",f63438e5:"2089","1a4e3797":"2138",f531b716:"2148","718ca91c":"2194","610ec0b5":"2239","3d725b75":"2276","2ab8e7e7":"2298","60c2c817":"2299",c3dfc33d:"2312","250ffcdd":"2343",ab0c1f88:"2388",b7ae13b2:"2404","963c03f5":"2436",cd323ffc:"2439","5281b7a2":"2443",f1a2b4e4:"2540",b32c755c:"2547","7292ec22":"2589","07db75e5":"2596","2a9b5780":"2601","3a2a2cbe":"2610",d26595bf:"2640","5388fcb8":"2648",b753e7fe:"2673","32a14031":"2722",a9e7f6cd:"2772",ab0ef0e3:"2805","0db4760e":"2811","34c1e1e7":"2832","7f3d36ad":"2833","14d1d990":"2891",cce49c68:"2904","3d7b86e7":"2931",e431d4ee:"2942","7b64d2e8":"2963",e6bd2de8:"2973",d8f58335:"3051",ebf52154:"3081",d53097a5:"3105",e50ee9c3:"3160","01681239":"3165",f59af033:"3190",aee07340:"3236","93002d83":"3242","6c233221":"3247",c3dc158a:"3277",ae2335f3:"3333",efdff6b0:"3342","680ed9ed":"3390","340d0560":"3441",e1252df2:"3484","5176c92e":"3525",c234ba49:"3547","0e3fdb5a":"3561","420e9d8d":"3615",e252aa27:"3636",f78aef8c:"3685","97d7d53e":"3733","8ff6a575":"3743",f6748474:"3747",d362fc0b:"3795","9d91368e":"3812",a8ca5d11:"3813","8070e160":"3822",f0907b6d:"3839","922074e2":"3840",dfa3dc49:"3851",d277059e:"3860",b9a03c38:"3888","32c7bf40":"3898",da21831e:"3908",f060f65c:"3987","45a5cd1f":"4000","9fc6df8f":"4021",cf6f5f9b:"4044",a60f0c4b:"4129","095d9053":"4174","0f38f188":"4195",fbcf914d:"4266","126a9cd0":"4269",fbaf079d:"4282","5a165616":"4328","58cc1d6e":"4378",ab68c950:"4395",cd3b874c:"4537","5979dd46":"4567","7c4790a0":"4646","8c1e922c":"4654",cd5efc4d:"4665",c6aa770e:"4693",e3aa6547:"4697",ec9fa214:"4708","41b31679":"4714","0a06c365":"4717",e483f3c9:"4726",f94f0fba:"4731",ae10697b:"4786",c107a2c8:"4836","7712976a":"4963","9dcacd54":"5002",dd67116e:"5039",fe67fe92:"5103","96465f27":"5116","6638db74":"5149","12f4838b":"5153",c1b42080:"5167","0252b8ff":"5174","09dedfdd":"5197","87469ac3":"5198","6cbe47eb":"5203","246340c6":"5223",b8f3160f:"5251",c67695e7:"5277","34eb4307":"5311","39f5e362":"5316","1f330703":"5320",aba71817:"5321",f8113afe:"5400","4177aba1":"5411","522d95f1":"5413","702cd497":"5439",b2456c44:"5463",bd465781:"5554","75f6c082":"5564","2938f7a2":"5725",c377a04b:"5742",abf95bb4:"5790","69dd637e":"5801",b45da50c:"5847",c1900591:"5899","2ad17f29":"5901",c3dc2396:"5926","235236aa":"5958","834808ff":"5964",dd81469d:"5987",e9efc8c6:"6026","5b0cdfa3":"6051","635f26b6":"6063","77b9c036":"6068",b0423865:"6081","77fc540a":"6094",d2e22918:"6124","7c5d32d8":"6161",e9be1565:"6176",bcd76598:"6233","4e63d43a":"6291",de69e49e:"6368","8003b96f":"6395","97c3cd43":"6447","50b0676a":"6452",afc4945b:"6481",fd60c3a8:"6506",a947fe06:"6511","53da1243":"6652",c778489f:"6673",de08e76e:"6677","847b3bc4":"6730","6a840bac":"6762",f2839486:"6793","3b8c55ea":"6803","762abe3e":"6828","372310f1":"6888",de6c661b:"6942",c2bab82f:"6945","6df7348f":"6951","18f4f7da":"7034",fe8cb35a:"7060","49af6a86":"7069",f4793a78:"7148","8307bb82":"7161","59785b52":"7200","5ff573a6":"7242","504a9fc5":"7248",d596b4b8:"7267","5379b7b3":"7275","1a00f7b1":"7291",f3d80b69:"7327",af48bdba:"7363",e15d65f4:"7371",ce48e831:"7452","6271ce2c":"7482","34a3c1ae":"7484",db0ebd24:"7492","07686352":"7494",bf20a2eb:"7585",f7cf1511:"7637",fd26103c:"7640",fa2a1a7c:"7651",ea61e9e9:"7666","08aff371":"7739",eb9f028f:"7791",e30200fb:"7845",ffe5129d:"8007",cd0bf424:"8016","6fe63dff":"8031","75753a1b":"8034","5fdf261e":"8042",e0636556:"8047","167e2e0a":"8068","65f1dd3d":"8086",f7c88408:"8095","2dc49bc9":"8106",c7381d34:"8162","22b369d5":"8164","11f54a6a":"8172","6e08701a":"8175",d3d9887a:"8249","82782dff":"8342","10f03480":"8351",e35f16a8:"8384","9c942e60":"8389","0ce1d2b6":"8396",d6daf0cc:"8428","0364e902":"8466","9533a6b7":"8471","778a7b8d":"8523","9e8ad6e8":"8529","53c8b813":"8568","935f2afb":"8581",a2c468b1:"8586","579c3ff9":"8607",f2761eee:"8652","755aca7b":"8698","1be78505":"8714",ce534227:"8720","6faa62d7":"8730","2579085f":"8805",e348fb9e:"8861",d8b566f1:"8875","0bd7b06f":"8988",af10d9fb:"8992","9d9f8394":"9013","4ccb6852":"9028","140acae8":"9042","21d02ecb":"9044","8cc21d50":"9047",d254ed97:"9073","0ab79735":"9147",e4b5e952:"9184","370ac30b":"9204","9db89767":"9211",e7acee98:"9218","3a0e6d91":"9242","6cf4c0df":"9279","1fec2b35":"9313","02d72f40":"9370","045f7301":"9425",d3d84dd8:"9432","01b4035b":"9450",e0fa3763:"9524","0e50cd4d":"9612",e3313a7e:"9679","4fac8f87":"9752","1f14308a":"9769","1f8b8b7b":"9777","1e7260bb":"9792","06df35bc":"9794",f14b6af8:"9795","88f3f33f":"9832",d0180ce2:"9894",c1eb0b52:"9937",ee0e1228:"9963",f66ef323:"9980","170989a3":"9995"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(f,d)=>{var c=r.o(e,f)?e[f]:void 0;if(0!==c)if(c)d.push(c[2]);else if(/^(1869|5354)$/.test(f))e[f]=0;else{var b=new Promise(((d,b)=>c=e[f]=[d,b]));d.push(c[2]=b);var a=r.p+r.u(f),t=new Error;r.l(a,(d=>{if(r.o(e,f)&&(0!==(c=e[f])&&(e[f]=void 0),c)){var b=d&&("load"===d.type?"missing":d.type),a=d&&d.target&&d.target.src;t.message="Loading chunk "+f+" failed.\n("+b+": "+a+")",t.name="ChunkLoadError",t.type=b,t.request=a,c[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,d)=>{var c,b,a=d[0],t=d[1],o=d[2],n=0;if(a.some((f=>0!==e[f]))){for(c in t)r.o(t,c)&&(r.m[c]=t[c]);if(o)var i=o(r)}for(f&&f(d);n Create a Bundle Resource | Fleet - + @@ -16,8 +16,8 @@ When creating a Bundle resources need to be explicitly specified in Resources can be compressed with gz. See here an example of how Rancher uses compression in go code.

    If you would like to deploy in downstream clusters, you need to define targets. Targets work similarly to targets in GitRepo. See Mapping to Downstream Clusters.

    The following example creates a nginx Deployment in the local cluster:

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    resources:
    # List of all resources that will be deployed
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml
    targets:
    - clusterName: local

    Targets

    The bundle can target multiple clusters. It uses the same targeting as the GitRepo. -Additional customization options can be specified per target:

    targets:
    - clusterSelector:
    matchLabels:
    env: dev
    defaultNamespace: lab-1
    helm:
    values:
    replicas: 1

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    Convert a Helm Chart into a Bundle

    You can use the Fleet CLI to convert a Helm chart into a bundle.

    For example, you can download and convert the "external secrets" operator chart like this:

    cat > targets.yaml <<EOF
    targets:
    - clusterSelector: {}
    EOF

    mkdir app
    cat > app/fleet.yaml <<EOF
    defaultNamespace: external-secrets
    helm:
    repo: https://charts.external-secrets.io
    chart: external-secrets
    EOF

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

    kubectl apply -f eso-bundle.yaml

    Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

    The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

    - +Additional customization options can be specified per target:

    targets:
    - clusterSelector:
    matchLabels:
    env: dev
    defaultNamespace: lab-1
    helm:
    values:
    replicas: 1

    Limitations

    Helm options related to downloading the helm chart will be ignored. The helm chart is downloaded by the fleet-cli, which creates the bundles. The bundle has to contain all the resources from the chart. Therefore the bundle will ignore:

    • spec.helm.repo
    • spec.helm.charts

    You can't use a fleet.yaml in resources, it is only used by the fleet-cli to create bundles.

    The spec.targetRestrictions field is not useful, as it is an allow list for targets specified in spec.targets. It is not needed, since targets are explicitly given in a bundle and an empty targetRestrictions defaults to allow.

    Convert a Helm Chart into a Bundle

    You can use the Fleet CLI to convert a Helm chart into a bundle.

    For example, you can download and convert the "external secrets" operator chart like this:

    cat > targets.yaml <<EOF
    targets:
    - clusterSelector: {}
    EOF

    mkdir app
    cat > app/fleet.yaml <<EOF
    defaultNamespace: external-secrets
    helm:
    repo: https://charts.external-secrets.io
    chart: external-secrets
    EOF

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - external-secrets app > eso-bundle.yaml

    kubectl apply -f eso-bundle.yaml

    Make sure you use a cluster selector in targets.yaml, that matches all clusters you want to deploy to.

    The blog post on Fleet: Multi-Cluster Deployment with the Help of External Secrets has more information.

    + \ No newline at end of file diff --git a/bundle-diffs.html b/bundle-diffs.html index 2bf33dd0a..c96e51f25 100644 --- a/bundle-diffs.html +++ b/bundle-diffs.html @@ -4,14 +4,14 @@ Generating Diffs to Ignore Modified GitRepos | Fleet - +
    Version: Next 🚧

    Generating Diffs to Ignore Modified GitRepos

    Continuous Delivery in Rancher is powered by fleet. When a user adds a GitRepo CR, then Continuous Delivery creates the associated fleet bundles.

    You can access these bundles by navigating to the Cluster Explorer (Dashboard UI), and selecting the Bundles section.

    The bundled charts may have some objects that are amended at runtime, for example in ValidatingWebhookConfiguration the caBundle is empty and the CA cert is injected by the cluster.

    This leads the status of the bundle and associated GitRepo to be reported as "Modified"

    Associated Bundle -

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

    https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    - +

    Fleet bundles support the ability to specify a custom jsonPointer patch.

    With the patch, users can instruct fleet to ignore object modifications.

    Simple Example

    In this simple example, we create a Service and ConfigMap that we apply a bundle diff onto.

    https://github.com/rancher/fleet-test-data/tree/master/bundle-diffs

    Gatekeeper Example

    In this example, we are trying to deploy opa-gatekeeper using Continuous Delivery to our clusters.

    The opa-gatekeeper bundle associated with the opa GitRepo is in modified state.

    Each path in the GitRepo CR, has an associated Bundle CR. The user can view the Bundles, and the associated diff needed in the Bundle status.

    In our case the differences detected are as follows:

      summary:
    desiredReady: 1
    modified: 1
    nonReadyResources:
    - bundleState: Modified
    modifiedStatus:
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    patch: '{"$setElementOrder/webhooks":[{"name":"validation.gatekeeper.sh"},{"name":"check-ignore-label.gatekeeper.sh"}],"webhooks":[{"clientConfig":{"caBundle":"Cg=="},"name":"validation.gatekeeper.sh","rules":[{"apiGroups":["*"],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["*"]}]},{"clientConfig":{"caBundle":"Cg=="},"name":"check-ignore-label.gatekeeper.sh","rules":[{"apiGroups":[""],"apiVersions":["*"],"operations":["CREATE","UPDATE"],"resources":["namespaces"]}]}]}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    patch: '{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"manager"}],"containers":[{"name":"manager","resources":{"limits":{"cpu":"1000m"}}}],"tolerations":[]}}}}'

    Based on this summary, there are three objects which need to be patched.

    We will look at these one at a time.

    1. ValidatingWebhookConfiguration:

    The gatekeeper-validating-webhook-configuration validating webhook has two ValidatingWebhooks in its spec.

    In cases where more than one element in the field requires a patch, that patch will refer these to as $setElementOrder/ELEMENTNAME

    From this information, we can see the two ValidatingWebhooks in question are:

      "$setElementOrder/webhooks": [
    {
    "name": "validation.gatekeeper.sh"
    },
    {
    "name": "check-ignore-label.gatekeeper.sh"
    }
    ],

    Within each ValidatingWebhook, the fields that need to be ignore are as follows:

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "validation.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    "*"
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "*"
    ]
    }
    ]
    },

    and

        {
    "clientConfig": {
    "caBundle": "Cg=="
    },
    "name": "check-ignore-label.gatekeeper.sh",
    "rules": [
    {
    "apiGroups": [
    ""
    ],
    "apiVersions": [
    "*"
    ],
    "operations": [
    "CREATE",
    "UPDATE"
    ],
    "resources": [
    "namespaces"
    ]
    }
    ]
    }

    In summary, we need to ignore the fields rules and clientConfig.caBundle in our patch specification.

    The field webhook in the ValidatingWebhookConfiguration spec is an array, so we need to address the elements by their index values.

    Based on this information, our diff patch would look as follows:

      - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    2. Deployment gatekeeper-controller-manager:

    The gatekeeper-controller-manager deployment is modified since there are cpu limits and tolerations applied (which are not in the actual bundle).

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    In this case, there is only 1 container in the deployment container spec, and that container has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    3. Deployment gatekeeper-audit:

    The gatekeeper-audit deployment is modified in a similarly, to the gatekeeper-controller-manager, with additional cpu limits and tolerations applied.

    {
    "spec": {
    "template": {
    "spec": {
    "$setElementOrder/containers": [
    {
    "name": "manager"
    }
    ],
    "containers": [
    {
    "name": "manager",
    "resources": {
    "limits": {
    "cpu": "1000m"
    }
    }
    }
    ],
    "tolerations": []
    }
    }
    }
    }

    Similar to gatekeeper-controller-manager, there is only 1 container in the deployments container spec, and that has cpu limits and tolerations added.

    Based on this information, our diff patch would look as follows:

      - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}

    Combining It All Together

    We can now combine all these patches as follows:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-audit
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: apps/v1
    kind: Deployment
    name: gatekeeper-controller-manager
    namespace: cattle-gatekeeper-system
    operations:
    - {"op": "remove", "path": "/spec/template/spec/containers/0/resources/limits/cpu"}
    - {"op": "remove", "path": "/spec/template/spec/tolerations"}
    - apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    name: gatekeeper-validating-webhook-configuration
    operations:
    - {"op": "remove", "path":"/webhooks/0/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/0/rules"}
    - {"op": "remove", "path":"/webhooks/1/clientConfig/caBundle"}
    - {"op": "remove", "path":"/webhooks/1/rules"}

    We can add these now to the bundle directly to test and also commit the same to the fleet.yaml in your GitRepo.

    Once these are added, the GitRepo should deploy and be in "Active" status.

    + \ No newline at end of file diff --git a/changelogs.html b/changelogs.html index 9672ad216..9e426d687 100644 --- a/changelogs.html +++ b/changelogs.html @@ -4,13 +4,13 @@ Next 🚧 | Fleet - +
    -
    Version: Next 🚧

    Next 🚧

    We are still working on the next release.

    - +
    Version: Next 🚧

    Next 🚧

    We are still working on the next release.

    + \ No newline at end of file diff --git a/changelogs/changelogs/next.html b/changelogs/changelogs/next.html index de00bb260..5e9b5dc1a 100644 --- a/changelogs/changelogs/next.html +++ b/changelogs/changelogs/next.html @@ -4,13 +4,13 @@ Next 🚧 | Fleet - + - +
    + \ No newline at end of file diff --git a/cli/fleet-agent.html b/cli/fleet-agent.html index 462cb1d36..8d46dffca 100644 --- a/cli/fleet-agent.html +++ b/cli/fleet-agent.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string                An identifier used to scope the agent bundleID names, typically the same as namespace
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    - +
    Version: Next 🚧

    fleet-agent

    fleet-agent [flags]

    Options

          --agent-scope string                An identifier used to scope the agent bundleID names, typically the same as namespace
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for fleet-agent
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-agent/fleet-agent_clusterstatus.html b/cli/fleet-agent/fleet-agent_clusterstatus.html index b3b1fff73..39f70f21a 100644 --- a/cli/fleet-agent/fleet-agent_clusterstatus.html +++ b/cli/fleet-agent/fleet-agent_clusterstatus.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet-agent clusterstatus

    Continuously report resource status to the upstream cluster

    fleet-agent clusterstatus [flags]

    Options

          --checkin-interval string   How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for clusterstatus
    --kubeconfig string kubeconfig file for agent's cluster
    --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

    SEE ALSO

    - +
    Version: Next 🚧

    fleet-agent clusterstatus

    Continuously report resource status to the upstream cluster

    fleet-agent clusterstatus [flags]

    Options

          --checkin-interval string   How often to post cluster status
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for clusterstatus
    --kubeconfig string kubeconfig file for agent's cluster
    --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-agent/fleet-agent_register.html b/cli/fleet-agent/fleet-agent_register.html index bd821833b..8be1d0f5d 100644 --- a/cli/fleet-agent/fleet-agent_register.html +++ b/cli/fleet-agent/fleet-agent_register.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet-agent register

    Register agent with an upstream cluster

    fleet-agent register [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for register
    --kubeconfig string kubeconfig file for agent's cluster
    --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

    SEE ALSO

    - +
    Version: Next 🚧

    fleet-agent register

    Register agent with an upstream cluster

    fleet-agent register [flags]

    Options

          --debug               Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -h, --help help for register
    --kubeconfig string kubeconfig file for agent's cluster
    --namespace string system namespace is the namespace, the agent runs in, e.g. cattle-fleet-system

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-cli/fleet.html b/cli/fleet-cli/fleet.html index d3aab4554..15d0ec8d0 100644 --- a/cli/fleet-cli/fleet.html +++ b/cli/fleet-cli/fleet.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet

    fleet [flags]

    Options

      -h, --help   help for fleet

    SEE ALSO

    • fleet apply - Create bundles from directories, and output them or apply them on a cluster
    • fleet cleanup - Clean up outdated cluster registrations
    • fleet deploy - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.
    • fleet gitcloner - Clones a git repository
    • fleet target - Print available targets for a bundle
    - +
    Version: Next 🚧

    fleet

    fleet [flags]

    Options

      -h, --help   help for fleet

    SEE ALSO

    • fleet apply - Create bundles from directories, and output them or apply them on a cluster
    • fleet cleanup - Clean up outdated cluster registrations
    • fleet deploy - Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.
    • fleet gitcloner - Clones a git repository
    • fleet target - Print available targets for a bundle
    + \ No newline at end of file diff --git a/cli/fleet-cli/fleet_apply.html b/cli/fleet-cli/fleet_apply.html index d09f352aa..ea5040d5f 100644 --- a/cli/fleet-cli/fleet_apply.html +++ b/cli/fleet-cli/fleet_apply.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet apply

    Create bundles from directories, and output them or apply them on a cluster

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string                     Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --context string kubeconfig context for authentication
    --correct-drift Rollback any change made from outside of Fleet
    --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated
    --correct-drift-keep-fail-history Keep helm history for failed rollbacks
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    --helm-credentials-by-path-file string Path of file containing helm credentials for paths
    --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided
    -h, --help help for apply
    --keep-resources Keep resources created after the GitRepo or Bundle is deleted
    -k, --kubeconfig string kubeconfig for authentication
    -l, --label strings Labels to apply to created bundles
    -n, --namespace string namespace (default "fleet-local")
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    SEE ALSO

    - +
    Version: Next 🚧

    fleet apply

    Create bundles from directories, and output them or apply them on a cluster

    fleet apply [flags] BUNDLE_NAME PATH...

    Options

      -b, --bundle-file string                     Location of the raw Bundle resource yaml
    --cacerts-file string Path of custom cacerts for helm repo
    --commit string Commit to assign to the bundle
    -c, --compress Force all resources to be compress
    --context string kubeconfig context for authentication
    --correct-drift Rollback any change made from outside of Fleet
    --correct-drift-force Use --force when correcting drift. Resources can be deleted and recreated
    --correct-drift-keep-fail-history Keep helm history for failed rollbacks
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    -f, --file string Location of the fleet.yaml
    --helm-credentials-by-path-file string Path of file containing helm credentials for paths
    --helm-repo-url-regex string Helm credentials will be used if the helm repo matches this regex. Credentials will always be used if this is empty or not provided
    -h, --help help for apply
    --keep-resources Keep resources created after the GitRepo or Bundle is deleted
    -k, --kubeconfig string kubeconfig for authentication
    -l, --label strings Labels to apply to created bundles
    -n, --namespace string namespace (default "fleet-local")
    -o, --output string Output contents to file or - for stdout
    --password-file string Path of file containing basic auth password for helm repo
    --paused Create bundles in a paused state
    -a, --service-account string Service account to assign to bundle created
    --ssh-privatekey-file string Path of ssh-private-key for helm repo
    --sync-generation int Generation number used to force sync the deployment
    --target-namespace string Ensure this bundle goes to this target namespace
    --targets-file string Addition source of targets and restrictions to be append
    --username string Basic auth username for helm repo

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-cli/fleet_cleanup.html b/cli/fleet-cli/fleet_cleanup.html index 3602a192f..dfd5a3d77 100644 --- a/cli/fleet-cli/fleet_cleanup.html +++ b/cli/fleet-cli/fleet_cleanup.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet cleanup

    Clean up outdated cluster registrations

    fleet cleanup [flags]

    Options

          --context string      kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --factor string Factor to increase delay between deletes (default: 1.1)
    -h, --help help for cleanup
    -k, --kubeconfig string kubeconfig for authentication
    --max string Maximum delay between deletes (default: 5s)
    --min string Minimum delay between deletes (default: 10ms)
    -n, --namespace string namespace (default "fleet-local")

    SEE ALSO

    - +
    Version: Next 🚧

    fleet cleanup

    Clean up outdated cluster registrations

    fleet cleanup [flags]

    Options

          --context string      kubeconfig context for authentication
    --debug Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --factor string Factor to increase delay between deletes (default: 1.1)
    -h, --help help for cleanup
    -k, --kubeconfig string kubeconfig for authentication
    --max string Maximum delay between deletes (default: 5s)
    --min string Minimum delay between deletes (default: 10ms)
    -n, --namespace string namespace (default "fleet-local")

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-cli/fleet_deploy.html b/cli/fleet-cli/fleet_deploy.html index 07be2f99e..072b5b58c 100644 --- a/cli/fleet-cli/fleet_deploy.html +++ b/cli/fleet-cli/fleet_deploy.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet deploy

    Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.

    fleet deploy [flags]

    Options

      -a, --agent-namespace string            Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.
    -d, --dry-run Print the resources that would be deployed, but do not actually deploy them
    -h, --help help for deploy
    -i, --input-file string Location of the YAML file containing the content and the bundledeployment resource
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    -n, --namespace string Set the default namespace. Deploy helm chart into this namespace.
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    - +
    Version: Next 🚧

    fleet deploy

    Deploy a bundledeployment/content resource to a cluster, by creating a Helm release. This will not deploy the bundledeployment/content resources directly to the cluster.

    fleet deploy [flags]

    Options

      -a, --agent-namespace string            Set the agent namespace, normally cattle-fleet-system. If set, fleet agent will garbage collect the helm release, i.e. delete it if the bundledeployment is missing.
    -d, --dry-run Print the resources that would be deployed, but do not actually deploy them
    -h, --help help for deploy
    -i, --input-file string Location of the YAML file containing the content and the bundledeployment resource
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    -n, --namespace string Set the default namespace. Deploy helm chart into this namespace.
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-cli/fleet_gitcloner.html b/cli/fleet-cli/fleet_gitcloner.html index 8ea64869c..89b0c3d69 100644 --- a/cli/fleet-cli/fleet_gitcloner.html +++ b/cli/fleet-cli/fleet_gitcloner.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet gitcloner

    Clones a git repository

    fleet gitcloner [REPO] [PATH] [flags]

    Options

      -b, --branch string                 git branch
    --ca-bundle-file string CA bundle file
    -h, --help help for gitcloner
    --insecure-skip-tls do not verify tls certificates
    --known-hosts-file string known hosts file
    --password-file string password file for basic auth
    --revision string git revision
    --ssh-private-key-file string ssh private key file path
    -u, --username string user name for basic auth

    SEE ALSO

    - +
    Version: Next 🚧

    fleet gitcloner

    Clones a git repository

    fleet gitcloner [REPO] [PATH] [flags]

    Options

      -b, --branch string                 git branch
    --ca-bundle-file string CA bundle file
    -h, --help help for gitcloner
    --insecure-skip-tls do not verify tls certificates
    --known-hosts-file string known hosts file
    --password-file string password file for basic auth
    --revision string git revision
    --ssh-private-key-file string ssh private key file path
    -u, --username string user name for basic auth

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-cli/fleet_target.html b/cli/fleet-cli/fleet_target.html index 6921171e8..fd09afa07 100644 --- a/cli/fleet-cli/fleet_target.html +++ b/cli/fleet-cli/fleet_target.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet target

    Print available targets for a bundle

    fleet target [flags]

    Options

      -b, --bundle-file string                Location of the Bundle resource yaml
    -l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML
    -h, --help help for target
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    -n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    - +
    Version: Next 🚧

    fleet target

    Print available targets for a bundle

    fleet target [flags]

    Options

      -b, --bundle-file string                Location of the Bundle resource yaml
    -l, --dump-input-list Dump the live resources, which impact targeting, like clusters, as YAML
    -h, --help help for target
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    -n, --namespace string Override the namespace of the bundle. Targeting searches this namespace for clusters.
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-cli/fleet_test.html b/cli/fleet-cli/fleet_test.html index d4a6abeeb..1c2a274df 100644 --- a/cli/fleet-cli/fleet_test.html +++ b/cli/fleet-cli/fleet_test.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleet test

    Match a bundle to a target and render the output (deprecated)

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    SEE ALSO

    - +
    Version: Next 🚧

    fleet test

    Match a bundle to a target and render the output (deprecated)

    fleet test [flags]

    Options

      -b, --bundle-file string    Location of the raw Bundle resource yaml
    -f, --file string Location of the fleet.yaml
    -g, --group string Cluster group to match against
    -L, --group-label strings Cluster group labels to match against
    -h, --help help for test
    -l, --label strings Cluster labels to match against
    -N, --name string Cluster name to match against
    -q, --quiet Just print the match and don't print the resources
    -t, --target string Explicit target to match

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-controller/fleetcontroller.html b/cli/fleet-controller/fleetcontroller.html index 948087787..5ca63267f 100644 --- a/cli/fleet-controller/fleetcontroller.html +++ b/cli/fleet-controller/fleetcontroller.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleetcontroller

    fleetcontroller [flags]

    Options

          --debug                             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-metrics disable metrics
    -h, --help help for fleetcontroller
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    --namespace string namespace to watch (default "cattle-fleet-system")
    --shard-id string only manage resources labeled with a specific shard ID
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    - +
    Version: Next 🚧

    fleetcontroller

    fleetcontroller [flags]

    Options

          --debug                             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --disable-metrics disable metrics
    -h, --help help for fleetcontroller
    --kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
    --namespace string namespace to watch (default "cattle-fleet-system")
    --shard-id string only manage resources labeled with a specific shard ID
    --zap-devel Development Mode defaults(encoder=consoleEncoder,logLevel=Debug,stackTraceLevel=Warn). Production Mode defaults(encoder=jsonEncoder,logLevel=Info,stackTraceLevel=Error) (default true)
    --zap-encoder encoder Zap log encoding (one of 'json' or 'console')
    --zap-log-level level Zap Level to configure the verbosity of logging. Can be one of 'debug', 'info', 'error', or any integer value > 0 which corresponds to custom debug levels of increasing verbosity
    --zap-stacktrace-level level Zap Level at and above which stacktraces are captured (one of 'info', 'error', 'panic').
    --zap-time-encoding time-encoding Zap time encoding (one of 'epoch', 'millis', 'nano', 'iso8601', 'rfc3339' or 'rfc3339nano'). Defaults to 'epoch'.

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-controller/fleetcontroller_agentmanagement.html b/cli/fleet-controller/fleetcontroller_agentmanagement.html index 440ed2272..aaf030f0d 100644 --- a/cli/fleet-controller/fleetcontroller_agentmanagement.html +++ b/cli/fleet-controller/fleetcontroller_agentmanagement.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleetcontroller agentmanagement

    fleetcontroller agentmanagement [flags]

    Options

          --disable-bootstrap   disable local cluster components
    -h, --help help for agentmanagement
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch

    Options inherited from parent commands

          --debug             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X

    SEE ALSO

    - +
    Version: Next 🚧

    fleetcontroller agentmanagement

    fleetcontroller agentmanagement [flags]

    Options

          --disable-bootstrap   disable local cluster components
    -h, --help help for agentmanagement
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch

    Options inherited from parent commands

          --debug             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-controller/fleetcontroller_cleanup.html b/cli/fleet-controller/fleetcontroller_cleanup.html index 654bf6933..1a34f29af 100644 --- a/cli/fleet-controller/fleetcontroller_cleanup.html +++ b/cli/fleet-controller/fleetcontroller_cleanup.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleetcontroller cleanup

    fleetcontroller cleanup [flags]

    Options

      -h, --help                help for cleanup
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch

    Options inherited from parent commands

          --debug             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X

    SEE ALSO

    - +
    Version: Next 🚧

    fleetcontroller cleanup

    fleetcontroller cleanup [flags]

    Options

      -h, --help                help for cleanup
    --kubeconfig string kubeconfig file
    --namespace string namespace to watch

    Options inherited from parent commands

          --debug             Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X

    SEE ALSO

    + \ No newline at end of file diff --git a/cli/fleet-controller/fleetcontroller_gitjob.html b/cli/fleet-controller/fleetcontroller_gitjob.html index 3f0b56061..421f5e09b 100644 --- a/cli/fleet-controller/fleetcontroller_gitjob.html +++ b/cli/fleet-controller/fleetcontroller_gitjob.html @@ -4,13 +4,13 @@ Fleet - +
    -
    Version: Next 🚧

    fleetcontroller gitjob

    fleetcontroller gitjob [flags]

    Options

          --debug                         Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")
    -h, --help help for gitjob
    --kubeconfig string Kubeconfig file
    --leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.
    --listen string The port the webhook listens. (default ":8080")
    --metrics-bind-address string The address the metric endpoint binds to. (default ":8081")
    --namespace string namespace to watch (default "cattle-fleet-system")
    --shard-node-selector string node selector to apply to jobs based on the shard ID, if any

    Options inherited from parent commands

          --disable-metrics   disable metrics
    --shard-id string only manage resources labeled with a specific shard ID

    SEE ALSO

    - +
    Version: Next 🚧

    fleetcontroller gitjob

    fleetcontroller gitjob [flags]

    Options

          --debug                         Turn on debug logging
    --debug-level int If debugging is enabled, set klog -v=X
    --gitjob-image string The gitjob image that will be used in the generated job. (default "rancher/fleet:dev")
    -h, --help help for gitjob
    --kubeconfig string Kubeconfig file
    --leader-elect Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.
    --listen string The port the webhook listens. (default ":8080")
    --metrics-bind-address string The address the metric endpoint binds to. (default ":8081")
    --namespace string namespace to watch (default "cattle-fleet-system")
    --shard-node-selector string node selector to apply to jobs based on the shard ID, if any

    Options inherited from parent commands

          --disable-metrics   disable metrics
    --shard-id string only manage resources labeled with a specific shard ID

    SEE ALSO

    + \ No newline at end of file diff --git a/cluster-group.html b/cluster-group.html index 5fe7638b7..e65855e61 100644 --- a/cluster-group.html +++ b/cluster-group.html @@ -4,7 +4,7 @@ Create Cluster Groups | Fleet - + @@ -13,8 +13,8 @@ The only parameter for a cluster group is essentially the selector. When you get to a certain scale cluster groups become a more reasonable way to manage your clusters. Cluster groups serve the purpose of giving aggregated -status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    - +status of the deployments and then also a simpler way to manage targets.

    A cluster group is created by creating a ClusterGroup resource like below

    kind: ClusterGroup
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: production-group
    namespace: clusters
    spec:
    # This is the standard metav1.LabelSelector format to match clusters by labels
    selector:
    matchLabels:
    env: prod
    + \ No newline at end of file diff --git a/cluster-registration.html b/cluster-registration.html index 8cd13ae3e..4bddb5545 100644 --- a/cluster-registration.html +++ b/cluster-registration.html @@ -4,7 +4,7 @@ Register Downstream Clusters | Fleet - + @@ -76,8 +76,8 @@ above example one can run the following one-liner:

    info

    If you are using Fleet standalone without Rancher, it must be installed as described in installation details.

    The manager-initiated registration is used when you add a cluster from the Rancher dashboard.

    Create Kubeconfig Secret

    The format of this secret is intended to match the format of the kubeconfig secret used in cluster-api. -This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    - +This means you can use cluster-api to create a cluster that is dynamically registered with Fleet.

    Kubeconfig Secret Example
    kind: Secret
    apiVersion: v1
    metadata:
    name: my-cluster-kubeconfig
    namespace: clusters
    data:
    value: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIHNlcnZlcjogaHR0cHM6Ly9leGFtcGxlLmNvbTo2NDQzCiAgbmFtZTogY2x1c3Rlcgpjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogY2x1c3RlcgogICAgdXNlcjogdXNlcgogIG5hbWU6IGRlZmF1bHQKY3VycmVudC1jb250ZXh0OiBkZWZhdWx0CmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZTogdXNlcgogIHVzZXI6CiAgICB0b2tlbjogc29tZXRoaW5nCg==

    Create Cluster Resource

    The cluster resource needs to reference the kubeconfig secret.

    Cluster Resource Example
    apiVersion: fleet.cattle.io/v1alpha1
    kind: Cluster
    metadata:
    name: my-cluster
    namespace: clusters
    labels:
    demo: "true"
    env: dev
    spec:
    kubeConfigSecret: my-cluster-kubeconfig
    + \ No newline at end of file diff --git a/concepts.html b/concepts.html index 4ba0f21b5..42b24d821 100644 --- a/concepts.html +++ b/concepts.html @@ -4,7 +4,7 @@ Core Concepts | Fleet - + @@ -24,8 +24,8 @@ Regardless of the source the contents are dynamically rendered into a Helm chart and installed into the downstream cluster as a helm release.

    • To see the life cycle of a bundle, click here.
  • BundleDeployment: When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for -the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • - +the cluster the agent is managing.

    • For an example of how to deploy Kubernetes manifests across clusters using Fleet customization, click here.
  • Downstream Cluster: Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet manager Kubernetes cluster is both the manager and downstream cluster at the same time.

  • Cluster Registration Token: Tokens used by agents to register a new cluster.

  • + \ No newline at end of file diff --git a/enableexperimental.html b/enableexperimental.html index 52a840ed8..2d38423c8 100644 --- a/enableexperimental.html +++ b/enableexperimental.html @@ -4,13 +4,13 @@ How to enable experimental features | Fleet - +
    -
    Version: Next 🚧

    How to enable experimental features

    Fleet supports experimental features that are disabled by default and that can be enabled by the user.

    Enabling/disabling experimental features is done using extra environment variables that are available when deploying rancher/fleet.

    Enabling an experimental feature

    At the moment we're writing this document, Fleet has OCI storage as an experimental feature.

    Enabling when installing Fleet stand-alone

    All you need to do is to pass something like:

    --set-string extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \
    --set-string extraEnv[0].value=true \

    to your helm install or update command.

    Please note you have to use --set-string because otherwise the boolean value won't work as expected.

    Enabling when installing Fleet with Rancher

    You can also activate the experimental features in Fleet when installing Rancher.

    The parameters are the same, but you have to add the fleet. prefix.

    --set-string fleet.extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \
    --set-string fleet.extraEnv[0].value=true \

    Available experimental features

    Right now Fleet supports the following experimental features:

    - +
    Version: Next 🚧

    How to enable experimental features

    Fleet supports experimental features that are disabled by default and that can be enabled by the user.

    Enabling/disabling experimental features is done using extra environment variables that are available when deploying rancher/fleet.

    Enabling an experimental feature

    At the moment we're writing this document, Fleet has OCI storage as an experimental feature.

    Enabling when installing Fleet stand-alone

    All you need to do is to pass something like:

    --set-string extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \
    --set-string extraEnv[0].value=true \

    to your helm install or update command.

    Please note you have to use --set-string because otherwise the boolean value won't work as expected.

    Enabling when installing Fleet with Rancher

    You can also activate the experimental features in Fleet when installing Rancher.

    The parameters are the same, but you have to add the fleet. prefix.

    --set-string fleet.extraEnv[0].name=EXPERIMENTAL_OCI_STORAGE \
    --set-string fleet.extraEnv[0].value=true \

    Available experimental features

    Right now Fleet supports the following experimental features:

    + \ No newline at end of file diff --git a/gitrepo-add.html b/gitrepo-add.html index 1f9dc3b40..012e9c8b0 100644 --- a/gitrepo-add.html +++ b/gitrepo-add.html @@ -4,7 +4,7 @@ Create a GitRepo Resource | Fleet - + @@ -17,8 +17,8 @@ for paths that are not present in this file. The path is the actual path to the bundle (ie to a folder containing a fleet.yaml file) within the git repository, which might have more segments than the entry under paths:.

    Example:

    path-one: # path path-one must exist in the repository
    username: user
    password: pass
    path-two: # path path-one must exist in the repository
    username: user2
    password: pass2
    caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICBNSUlEblRDQ0FvV2dBd0lCQWdJVUNwMHB2SVJTb2c0eHJKN2Q1SUI2ME1ka0k1WXdEUVlKS29aSWh2Y05BUUVMCiAgICBCUUF3WGpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NCiAgICBHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2CiAgICBjbWN3SGhjTk1qTXdOREkzTVRVd056VXpXaGNOTWpnd05ESTFNVFV3TnpVeldqQmVNUXN3Q1FZRFZRUUdFd0pCCiAgICBWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwCiAgICBjeUJRZEhrZ1RIUmtNUmN3RlFZRFZRUUREQTV5WVc1amFHVnlMbTE1TG05eVp6Q0NBU0l3RFFZSktvWklodmNOCiAgICBBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXBvZE5TMDB6NDc1dnVSc2ZZcTFRYTFHQVl3QU92anV4MERKTHY5CiAgICBrZFhwT091dGdjMU8yWUdqNUlCVGQzVmpISmFJYUg3SDR2Rm84RlBaMG9zcU9YaFg3eUM4STdBS3ZhOEE5VmVmCiAgICBJVXp6Vlo1cCs1elNxRjdtZTlOaUNiL0pVSkZLT0ZsTkF4cjZCcXhoMEIyN1VZTlpjaUIvL1V0L0I2eHJuVE55CiAgICBoRzJiNzk4bjg4bFZqY3EzbEE0djFyM3VzWGYxVG5aS2t2UEN4ZnFHYk5OdTlpTjdFZnZHOWoyekdHcWJvcDRYCiAgICBXY3VSa3N3QkgxZlRNS0ZrbGcrR1VsZkZPMGFzL3phalVOdmdweTlpdVBMZUtqZTVWcDBiMlBLd09qUENpV2d4CiAgICBabDJlVDlNRnJjV0F3NTg3emE5NDBlT1Era2pkdmVvUE5sU2k3eVJMMW96YlRka0NBd0VBQWFOVE1GRXdIUVlECiAgICBWUjBPQkJZRUZEQkNkYjE4M1hsU0tWYzBxNmJSTCt0dVNTV3lNQjhHQTFVZEl3UVlNQmFBRkRCQ2RiMTgzWGxTCiAgICBLVmMwcTZiUkwrdHVTU1d5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCCiAgICBBQ1BCVERkZ0dCVDVDRVoxd1pnQmhKdm9GZTk2MUJqVCtMU2RxSlpsSmNRZnlnS0hyNks5ZmZaY1ZlWlBoMVU0CiAgICB3czBuWGNOZiszZGJlTjl4dVBiY0VqUWlQaFJCcnRzalE1T1JiVHdYWEdBdzlYbDZYTkl6YjN4ZDF6RWFzQXZPCiAgICBJMjM2ZHZXQ1A0dWoycWZqR0FkQjJnaXU2b2xHK01CWHlneUZKMElzRENraldLZysyWEdmU3lyci9KZU1vZlFBCiAgICB1VU9wcFVGdERYd0lrUW1VTGNVVUxWcTdtUVNQb0lzVkNNM2hKNVQzczdUSWtHUDZVcGVSSjgzdU9LbURYMkRHCiAgICBwVWVQVHBuVWVLOVMzUEVKTi9XcmJSSVd3WU1OR29qdDRKWitaK1N6VE1aVkh0SlBzaGpjL1hYOWZNU1ZXQmlzCiAgICBQRW5MU256MDQ4OGFUQm5SUFlnVXFsdz0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
    sshPrivateKey: ICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRFF6Q0NBaXNDRkgxTm5YUWI5SlV6anNBR3FSc3RCYncwRlFpak1BMEdDU3FHU0liM0RRRUJDd1VBTUY0eAogICAgQ3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSURBcFRiMjFsTFZOMFlYUmxNU0V3SHdZRFZRUUtEQmhKYm5SbAogICAgY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNTURuSmhibU5vWlhJdWJYa3ViM0puTUI0WAogICAgRFRJek1EUXlOekUxTVRBMU5Gb1hEVEkwTURReU5qRTFNVEExTkZvd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgogICAgQmdOVkJBZ01DbE52YldVdFUzUmhkR1V4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNQogICAgSUV4MFpERVhNQlVHQTFVRUF3d09jbUZ1WTJobGNpNXRlUzV2Y21jd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQogICAgQTRJQkR3QXdnZ0VLQW9JQkFRRGd6UUJJTW8xQVFHNnFtYmozbFlYUTFnZjhYcURTbjdyM2lGcVZZZldDVWZOSwogICAgaGZwampTRGpOMmRWWEV2UXA3R0t3akFHUElFbXR5RmxyUW5rUGtnTGFSaU9jSDdNN0p2c3ZIa0Ewd0g0dzJ2QgogICAgUEp6aVlINWh2MUE2WS9NcFM5bVkvQUVxVm80TUJkdnNZQzc3MFpCbzVBMitIUEtMd1YzMVZyYlhhTytWeUJtNAogICAgSmJhZHlNUk40N3BKRWdPMjJaYVRXL3Y3S1dKdjNydGJTMlZVSkNlU0piWlpsN09ocHhLRTVocStmK0RWaU1mcQogICAgTWx4ODNEV2pVSlVkV3lqVUZYVlk0bEdVaUtrRWVtSlVuSlVyY1ErOXE1SzVaWmhyRjhoRXhKRjhiZTZjemVzeAogICAga1VWN3dKb1RjWkd2bUhYSk1FNmtrQXh4Mmh3bU8wSFcyQWdDdTJZekFnTUJBQUV3RFFZSktvWklodmNOQVFFTAogICAgQlFBRGdnRUJBS1BpTWdXc1dCTnJvRkY2aWpYL2xMM3FxaWc4TjlkR1VPWDIyRVJDU1RTekNONjM0ZTFkZUhsdQogICAgbTc5OU11Q3hvWSsyZWluNlV1cFMvTEV6cnpvU2dDVWllQzQrT3ZralF5eGJpTFR6bW1OWEFnd09TM3RvTHRGWAogICAgbytmWWpSMU9xcHVPS29kMkhiYjliczRWcXdaNHEvMlVKbXE2Q01pYjZKZUE2VFJvK2Rkc0pUM2dDOFhWL1Z1MAogICAgNnkwdjJxdTM0bm1MYjFxOHFTS1RwZXYyQmwzQUJGY3NyS0JvNHFieUM2bnBTbnpZenNYcS90SlFLclplNE4vMgogICAgUXIzd1dxQ0pDVWUrMWVsT3A2b0JVcXNWSnc3aHk3YzRLc1Fna09ERDJkc2NuNEF1NGJhWlY2QmpySm1USVY0aQogICAgeXJ1dk9oZ2lINklGUVdDWmVQM2s0MU5obWRzRTNHQT0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K

    Create the secret

    kubectl create secret generic path-auth-secret -n fleet-default --from-file=secrets-path.yaml

    In the previous example credentials for username user will be used for the path path-one and credentials for username user2 will be used for the path path-two.

    caBundle and sshPrivateKey must be base64 encoded.

    note

    If you are using "rancher-backups" and want this secret to be included the backup, please add the label resources.cattle.io/backup: true to the secret. In that case, make sure to encrypt the backup to protect sensitive credentials.

    Storing Credentials in Git

    It's recommended not to store credentials in Git. Even if the repository is properly protected, the secrets are at risk when cloning, etc. As a workaround tools like SOPS can be used to encrypt the credentials.

    Instead it is recommended to reference secrets in the downstream cluster. For manifest-style and kustomize-style bundles this must be done in the manifests, e.g. by mounting the secrets or referencing them as environment variables. -Helm-style bundles can use valuesFrom to read values from a secret in the downstream cluster.

    When using Kubernetes encryption at rest and storing credentials in Git, it is recommended to configure the upstream cluster to include several Fleet CRDs in encryption resource list:

    - secrets
    - bundles.fleet.cattle.io
    - bundledeployments.fleet.cattle.io
    - contents.fleet.cattle.io

    Troubleshooting

    See Fleet Troubleshooting section here.

    - +Helm-style bundles can use valuesFrom to read values from a secret in the downstream cluster.

    When using Kubernetes encryption at rest and storing credentials in Git, it is recommended to configure the upstream cluster to include several Fleet CRDs in encryption resource list:

    - secrets
    - bundles.fleet.cattle.io
    - bundledeployments.fleet.cattle.io
    - contents.fleet.cattle.io

    Troubleshooting

    See Fleet Troubleshooting section here.

    + \ No newline at end of file diff --git a/gitrepo-content.html b/gitrepo-content.html index 470a69b7c..d710e9078 100644 --- a/gitrepo-content.html +++ b/gitrepo-content.html @@ -4,7 +4,7 @@ Git Repository Contents | Fleet - + @@ -53,8 +53,8 @@ will target deployment.yaml. The patch will be applied using JSON Which strategy is used is based on the file content. Even though JSON strategies are used, the files can be written using YAML syntax.

    Cluster and Bundle State

    See Cluster and Bundle state.

    Nested GitRepo CRs

    Nested GitRepo CRs (defining a GitRepo that points to a repository containing one or more GitRepo resources) is supported. You can use this feature to take advantage of GitOps in your GitRepo resources or, for example, to split complex scenarios into more than one GitRepo resource. -When finding a GitRepo in a Bundle Fleet will simply deploy it as any other resource.

    See this example.

    - +When finding a GitRepo in a Bundle Fleet will simply deploy it as any other resource.

    See this example.

    + \ No newline at end of file diff --git a/gitrepo-targets.html b/gitrepo-targets.html index 21d461264..1fa76cfa8 100644 --- a/gitrepo-targets.html +++ b/gitrepo-targets.html @@ -4,7 +4,7 @@ Mapping to Downstream Clusters | Fleet - + @@ -23,8 +23,8 @@ and add clusters to it.

    this issue for more details.

  • Helm.WaitForJobs

  • Kustomize.Dir

  • YAML.Overlays

  • Diff.ComparePatches

  • Additional Examples

    Examples using raw Kubernetes YAML, Helm charts, Kustomize, and combinations -of the three are in the Fleet Examples repo.

    - +of the three are in the Fleet Examples repo.

    + \ No newline at end of file diff --git a/imagescan.html b/imagescan.html index f336cde48..b122a551b 100644 --- a/imagescan.html +++ b/imagescan.html @@ -4,7 +4,7 @@ Using Image Scan to Update Container Image References | Fleet - + @@ -12,8 +12,8 @@
    Version: Next 🚧

    Using Image Scan to Update Container Image References

    Image scan in fleet allows you to scan your image repository, fetch the desired image and update your git repository, without the need to manually update your manifests.

    caution

    This feature is considered as experimental feature.

    Go to fleet.yaml and add the following section.

    imageScans:
    # specify the policy to retrieve images, can be semver or alphabetical order
    - policy:
    # if range is specified, it will take the latest image according to semver order in the range
    # for more details on how to use semver, see https://github.com/Masterminds/semver
    semver:
    range: "*"
    # can use ascending or descending order
    alphabetical:
    order: asc

    # specify images to scan
    image: "your.registry.com/repo/image"

    # Specify the tag name, it has to be unique in the same bundle
    tagName: test-scan

    # specify secret to pull image if in private registry
    secretRef:
    name: dockerhub-secret

    # Specify the scan interval
    interval: 5m
    info

    You can create multiple image scans in fleet.yaml.

    note

    Semver will ignore pre-release versions (for example, 0.0.1-10) unless a pre-release version is explicitly used in the range definition. For example, the "*" range will ignore pre-releases while ">= 0.0.1-10" will take them into account.

    Go to your manifest files and update the field that you want to replace. For example:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: redis-slave
    spec:
    selector:
    matchLabels:
    app: redis
    role: slave
    tier: backend
    replicas: 2
    template:
    metadata:
    labels:
    app: redis
    role: slave
    tier: backend
    spec:
    containers:
    - name: slave
    image: <image>:<tag> # {"$imagescan": "test-scan"}
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379
    note

    There are multiple form of tagName you can reference. For example

    {"$imagescan": "test-scan"}: Use full image name(foo/bar:tag)

    {"$imagescan": "test-scan:name"}: Only use image name without tag(foo/bar)

    {"$imagescan": "test-scan:tag"}: Only use image tag

    {"$imagescan": "test-scan:digest"}: Use full image name with digest(foo/bar:tag@sha256...)

    Create a GitRepo that includes your fleet.yaml

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: my-repo
    namespace: fleet-local
    spec:
    # change this to be your own repo
    repo: https://github.com/rancher/fleet-examples
    # define how long it will sync all the images and decide to apply change
    imageScanInterval: 5m
    # user must properly provide a secret that have write access to git repository
    clientSecretName: secret
    # specify the commit pattern
    imageScanCommit:
    authorName: foo
    authorEmail: foo@bar.com
    messageTemplate: "update image"

    Try pushing a new image tag, for example, <image>:<new-tag>. Wait for a while and there should be a new commit pushed into your git repository to change tag in deployment.yaml. -Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    - +Once change is made into git repository, fleet will read through the change and deploy the change into your cluster.

    + \ No newline at end of file diff --git a/index.html b/index.html index a757c1254..ecbe42f7d 100644 --- a/index.html +++ b/index.html @@ -4,13 +4,13 @@ Overview | Fleet - +
    -
    Version: Next 🚧

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    - +
    Version: Next 🚧

    Overview

    What is Fleet?

    • Cluster engine: Fleet is a container management and deployment engine designed to offer users more control on the local cluster and constant monitoring through GitOps. Fleet focuses not only on the ability to scale, but it also gives users a high degree of control and visibility to monitor exactly what is installed on the cluster.

    • Deployment management: Fleet can manage deployments from git of raw Kubernetes YAML, Helm charts, Kustomize, or any combination of the three. Regardless of the source, all resources are dynamically turned into Helm charts, and Helm is used as the engine to deploy all resources in the cluster. As a result, users can enjoy a high degree of control, consistency, and auditability of their clusters.

    Configuration Management

    Fleet is fundamentally a set of Kubernetes custom resource definitions (CRDs) and controllers that manage GitOps for a single Kubernetes cluster or a large scale deployment of Kubernetes clusters. It is a distributed initialization system that makes it easy to customize applications and manage HA clusters from a single point.

    + \ No newline at end of file diff --git a/installation.html b/installation.html index bab12e762..f2075a3b5 100644 --- a/installation.html +++ b/installation.html @@ -4,7 +4,7 @@ Installation Details | Fleet - + @@ -47,8 +47,8 @@ the ca.pem is not correct. The contents of the $API_SERVER_CA and the CA certificate is in the file ca.pem. If your API server URL is signed by a well-known CA you can omit the apiServerCA parameter below or just create an empty ca.pem file (ie touch ca.pem).

    Setup the environment with your specific values, e.g.:

    API_SERVER_URL="https://example.com:6443"
    API_SERVER_CA="ca.pem"

    Once you have validated the API server URL and API server CA parameters, install the following two Helm charts.

    First add Fleet's Helm repository.
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Second install the Fleet CustomResourcesDefintions.

    helm -n cattle-fleet-system install --create-namespace --wait \
    fleet-crd

    Third install the Fleet controllers.

    helm -n cattle-fleet-system install --create-namespace --wait \
    --set apiServerURL="$API_SERVER_URL" \
    --set-file apiServerCA="$API_SERVER_CA" \
    fleet

    At this point the Fleet manager should be ready. You can now register clusters and git repos with -the Fleet manager.

    - +the Fleet manager.

    + \ No newline at end of file diff --git a/multi-user.html b/multi-user.html index 145379769..b4fde035d 100644 --- a/multi-user.html +++ b/multi-user.html @@ -4,7 +4,7 @@ Setup Multi User | Fleet - + @@ -18,8 +18,8 @@ users are only restricted to namespaces, but namespaces don't provide much isolation on their own. E.g. they can still consume as many resources as they like.

    However, the existing Fleet restrictions allow users to share clusters, and deploy resources without conflicts.

    Example Fleet Standalone

    This would create a user 'fleetuser', who can only manage GitRepo resources in the 'project1' namespace.

    kubectl create serviceaccount fleetuser
    kubectl create namespace project1
    kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser

    If we want to give access to multiple namespaces, we can use a single cluster role with two role bindings:

    kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
    kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
    kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser

    This makes sure, tenants can't interfere with GitRepo resources from other tenants, since they don't have access to their namespaces.

    Example Fleet in Rancher

    When a new fleet workspace is created, a corresponding namespace with an identical name is automatically generated within the Rancher local cluster. -For a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:

    • list/get the fleetworkspace cluster-wide resource in the local cluster
    • Permissions to create fleet resources (such as bundles, gitrepos, ...) in the backing namespace for the workspace in the local cluster.

    Let's grant permissions to deploy fleet resources in the project1 and project2 fleet workspaces:

    • To create the project1 and project2 fleet workspaces, you can either do it in the Rancher UI or use the following YAML resources:
    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project1
    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project2
    • Create a GlobalRole that grants permission to deploy fleet resources in the project1 and project2 fleet workspaces:
    apiVersion: management.cattle.io/v3
    kind: GlobalRole
    metadata:
    name: fleet-projects1and2
    namespacedRules:
    project1:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    project2:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    rules:
    - apiGroups:
    - management.cattle.io
    resourceNames:
    - project1
    - project2
    resources:
    - fleetworkspaces
    verbs:
    - '*'

    Assign the GlobalRole to users or groups, more info can be found in the Rancher docs

    The user now has access to the Continuous Delivery tab in Rancher and can deploy resources to both the project1 and project2 workspaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    - +For a user to see and deploy fleet resources in a specific workspace, they need at least the following permissions:

    • list/get the fleetworkspace cluster-wide resource in the local cluster
    • Permissions to create fleet resources (such as bundles, gitrepos, ...) in the backing namespace for the workspace in the local cluster.

    Let's grant permissions to deploy fleet resources in the project1 and project2 fleet workspaces:

    • To create the project1 and project2 fleet workspaces, you can either do it in the Rancher UI or use the following YAML resources:
    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project1
    apiVersion: management.cattle.io/v3
    kind: FleetWorkspace
    metadata:
    name: project2
    • Create a GlobalRole that grants permission to deploy fleet resources in the project1 and project2 fleet workspaces:
    apiVersion: management.cattle.io/v3
    kind: GlobalRole
    metadata:
    name: fleet-projects1and2
    namespacedRules:
    project1:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    project2:
    - apiGroups:
    - fleet.cattle.io
    resources:
    - gitrepos
    - bundles
    - clusterregistrationtokens
    - gitreporestrictions
    - clusters
    - clustergroups
    verbs:
    - '*'
    rules:
    - apiGroups:
    - management.cattle.io
    resourceNames:
    - project1
    - project2
    resources:
    - fleetworkspaces
    verbs:
    - '*'

    Assign the GlobalRole to users or groups, more info can be found in the Rancher docs

    The user now has access to the Continuous Delivery tab in Rancher and can deploy resources to both the project1 and project2 workspaces.

    Allow Access to Clusters

    This assumes all GitRepos created by 'fleetuser' have the team: one label. Different labels could be used, to select different cluster namespaces.

    In each of the user's namespaces, as an admin create a BundleNamespaceMapping.

    kind: BundleNamespaceMapping
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: mapping
    namespace: project1

    # Bundles to match by label.
    # The labels are defined in the fleet.yaml # labels field or from the
    # GitRepo metadata.labels field
    bundleSelector:
    matchLabels:
    team: one
    # or target one repo
    #fleet.cattle.io/repo-name: simpleapp

    # Namespaces, containing clusters, to match by label
    namespaceSelector:
    matchLabels:
    kubernetes.io/metadata.name: fleet-default
    # the label is on the namespace
    #workspace: prod

    The target section in the GitRepo resource can be used to deploy only to a subset of the matched clusters.

    Restricting Access to Downstream Clusters

    Admins can further restrict tenants by creating a GitRepoRestriction in each of their namespaces.

    kind: GitRepoRestriction
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: restriction
    namespace: project1

    allowedTargetNamespaces:
    - project1simpleapp

    This will deny the creation of cluster wide resources, which may interfere with other tenants and limit the deployment to the 'project1simpleapp' namespace.

    An Example GitRepo Resource

    A GitRepo resource created by a tenant, without admin access could look like this:

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: simpleapp
    namespace: project1
    labels:
    team: one

    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - bundle-diffs

    targetNamespace: project1simpleapp

    # do not match the upstream/local cluster, won't work
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    This includes the team: one label and and the required targetNamespace.

    Together with the previous BundleNamespaceMapping it would target all clusters with a env: dev label in the 'fleet-default' namespace.

    note

    BundleNamespaceMappings do not work with local clusters, so make sure not to target them.

    + \ No newline at end of file diff --git a/namespaces.html b/namespaces.html index 23bb2a141..4d8cb5e83 100644 --- a/namespaces.html +++ b/namespaces.html @@ -4,7 +4,7 @@ Namespaces | Fleet - + @@ -70,8 +70,8 @@ for that cluster. These namespaces are named in the form cluster-${namespace}-${cluster}-${random}. The purpose of this namespace is that all BundleDeployments for that cluster are put into this namespace and then the downstream cluster is given access to watch and update -BundleDeployments in that namespace only.

    - +BundleDeployments in that namespace only.

    + \ No newline at end of file diff --git a/oci-storage.html b/oci-storage.html index 23f929eef..dfed8e369 100644 --- a/oci-storage.html +++ b/oci-storage.html @@ -4,14 +4,14 @@ OCI Storage | Fleet - +
    Version: Next 🚧

    OCI Storage

    Summary

    Fleet stores by default the bundle resources in etcd twice. This is done via the k8s API and there is a size limit, depending on the etcd configuration.

    This feature will allow users to choose an OCI registry as storage for bundle resources. The bundle resource will have an empty resource list and a reference to the OCI repository server. The bundledeployment will not point to a content resource, but to an OCI repository server instead.

    When using this feature the bundle resources are stored once, in the configured OCI registry, and Fleet won't be tied to possible etcd size limitations.

    This may me interesting for users who need to store big Bundles, and could also be seen as the first step for an OCIOps feature in the future.

    Once the OCI registry is enabled, Fleet will use it as the source for storing Bundle resources. -When Fleet can't access the OCI registry, it won't fall back to default etcd storage. Instead, it will log errors so they can be fixed.

    Configuring the OCI registry

    OCI registry values should be configured as an extra section in the GitRepo yaml.

    There are the fields involved:

    // when ociRegistry is defined Fleet will use oci registry as storage
    ociRegistry:
    // reference is the OCI registry url.
    reference: "docker.io/your-user-here"
    // secret name where the credentials for the OCI registry are.
    // expects a generic secret with username and password keys set.
    authSecretName: oci-secret
    // basicHTTP allows Fleet to uses basic http connections to communicate
    // with the registry (defaults to false)
    basicHTTP: false
    // insecureSkipTLS allows connections to the OCI registry
    // without certs (defaults to false)
    insecureSkipTLS: false
    - +When Fleet can't access the OCI registry, it won't fall back to default etcd storage. Instead, it will log errors so they can be fixed.

    Configuring the OCI registry

    OCI registry values should be configured as an extra section in the GitRepo yaml.

    There are the fields involved:

    // when ociRegistry is defined Fleet will use oci registry as storage
    ociRegistry:
    // reference is the OCI registry url.
    reference: "docker.io/your-user-here"
    // secret name where the credentials for the OCI registry are.
    // expects a generic secret with username and password keys set.
    authSecretName: oci-secret
    // basicHTTP allows Fleet to uses basic http connections to communicate
    // with the registry (defaults to false)
    basicHTTP: false
    // insecureSkipTLS allows connections to the OCI registry
    // without certs (defaults to false)
    insecureSkipTLS: false
    + \ No newline at end of file diff --git a/quickstart.html b/quickstart.html index ada8bf5ff..5dff91b52 100644 --- a/quickstart.html +++ b/quickstart.html @@ -4,15 +4,15 @@ Quick Start | Fleet - +
    Version: Next 🚧

    Quick Start

    Who needs documentation, lets just run this thing!

    Install

    Fleet is distributed as a Helm chart. Helm 3 is a CLI, has no server side component, and its use is fairly straightforward. To install the Helm 3 CLI follow the official install instructions.

    Fleet in Rancher

    Rancher has separate helm charts for Fleet and uses a different repository.

    brew install helm
    helm repo add fleet https://rancher.github.io/fleet-helm-charts/

    Install the Fleet Helm charts (there's two because we separate out CRDs for ultimate flexibility.)

    helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
    helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet

    Add a Git Repo to Watch

    Change spec.repo to your git repo of choice. Kubernetes manifest files that should -be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    - +be deployed should be in /manifests in your repo.

    cat > example.yaml << "EOF"
    apiVersion: fleet.cattle.io/v1alpha1
    kind: GitRepo
    metadata:
    name: sample
    # This namespace is special and auto-wired to deploy to the local cluster
    namespace: fleet-local
    spec:
    # Everything from this repo will be run in this cluster. You trust me right?
    repo: "https://github.com/rancher/fleet-examples"
    paths:
    - simple
    EOF

    kubectl apply -f example.yaml

    Get Status

    Get status of what fleet is doing

    kubectl -n fleet-local get fleet

    You should see something like this get created in your cluster.

    kubectl get deploy frontend
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    frontend 3/3 3 3 116m

    Enjoy and read the docs.

    + \ No newline at end of file diff --git a/ref-bundle-stages.html b/ref-bundle-stages.html index 7c1d3fe3d..20065050a 100644 --- a/ref-bundle-stages.html +++ b/ref-bundle-stages.html @@ -4,13 +4,13 @@ Bundle Lifecycle | Fleet - +
    -
    Version: Next 🚧

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    Examining the Bundle Lifecycle With the CLI

    Several fleet CLI commands help with debugging bundles.

    fleet apply

    Apply renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource.

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/

    More information on how to create bundles with fleet apply can be found in the section on bundles.

    fleet target

    Target reads a bundle from a file and works with a live cluster to print out the bundledeployment & content resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.

    fleet deploy

    Deploy takes the output of fleet target, or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment.

    The deploy command can be used to bring bundles to air-gapped clusters.

    Lifecycle CLI Example

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    # for information about apply see https://fleet.rancher.io/bundle-add
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/
    fleet target --bundle-file bundle.yaml --list-inputs > bd.yaml
    fleet deploy --input-file bd.yaml --dry-run
    - +
    Version: Next 🚧

    Bundle Lifecycle

    A bundle is an internal resource used for the orchestration of resources from git. When a GitRepo is scanned it will produce one or more bundles.

    To demonstrate the life cycle of a Fleet bundle, we will use multi-cluster/helm as a case study.

    1. User will create a GitRepo that points to the multi-cluster/helm repository.
    2. The gitjob-controller will sync changes from the GitRepo and detect changes from the polling or webhook event. With every commit change, the gitjob-controller will create a job that clones the git repository, reads content from the repo such as fleet.yaml and other manifests, and creates the Fleet bundle.

    Note: The job pod with the image name rancher/tekton-utils will be under the same namespace as the GitRepo.

    1. The fleet-controller then syncs changes from the bundle. According to the targets, the fleet-controller will create BundleDeployment resources, which are a combination of a bundle and a target cluster.
    2. The fleet-agent will then pull the BundleDeployment from the Fleet controlplane. The agent deploys bundle manifests as a Helm chart from the BundleDeployment into the downstream clusters.
    3. The fleet-agent will continue to monitor the application bundle and report statuses back in the following order: bundledeployment > bundle > GitRepo > cluster.

    This diagram shows the different rendering stages a bundle goes through until deployment.

    Bundle Stages

    Examining the Bundle Lifecycle With the CLI

    Several fleet CLI commands help with debugging bundles.

    fleet apply

    Apply renders a folder with Kubernetes resources, such as a Helm chart, manifests, or kustomize folders, into a Fleet bundle resource.

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/

    More information on how to create bundles with fleet apply can be found in the section on bundles.

    fleet target

    Target reads a bundle from a file and works with a live cluster to print out the bundledeployment & content resource, which fleetcontroller would create. It takes a namespace as an argument, so it can look in that namespace for e.g. cluster resources. It can also dump the data structure which is used during "targeting", so decisions taken regarding labels and cluster names can be checked.

    fleet deploy

    Deploy takes the output of fleet target, or a dumped bundledeployment/content resource and deploys it to a cluster, just like fleet-agent would. It supports a dry run mode, to print out the resources which would be created, instead of installing them with helm. Since the command doesn't create the input resources, a running fleet-agent would likely garbage collect the deployment.

    The deploy command can be used to bring bundles to air-gapped clusters.

    Lifecycle CLI Example

    git clone https://github.com/rancher/fleet-test-data
    cd fleet-test-data
    # for information about apply see https://fleet.rancher.io/bundle-add
    fleet apply -n fleet-local -o bundle.yaml testbundle simple-chart/
    fleet target --bundle-file bundle.yaml --list-inputs > bd.yaml
    fleet deploy --input-file bd.yaml --dry-run
    + \ No newline at end of file diff --git a/ref-bundle.html b/ref-bundle.html index 4055bdaef..2976e9ff8 100644 --- a/ref-bundle.html +++ b/ref-bundle.html @@ -4,14 +4,14 @@ Bundle Resource | Fleet - +
    Version: Next 🚧

    Bundle Resource

    Bundles are automatically created by Fleet when a GitRepo is created.

    The content of the resource corresponds to the BundleSpec. -For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    - +For more information on how to use the Bundle resource Create a Bundle Resource.

    kind: Bundle
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-bundle
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # Namespace used for resources that do not specify a namespace.
    # This field is not used to enforce or lock down the deployment to a specific namespace.
    # defaultNamespace: test

    # If present will assign all resource to this
    # namespace and if any cluster scoped resource exists the deployment will fail.
    # targetNamespace: app

    # Kustomize options for the deployment, like the dir containing the kustomization.yaml file.
    # kustomize: ...

    # Helm options for the deployment, like the chart name, repo and values.
    # helm: ...

    # ServiceAccount which will be used to perform this deployment.
    # serviceAccount: sa

    # ForceSyncGeneration is used to force a redeployment.
    # forceSyncGeneration: 0

    # YAML options, if using raw YAML these are names that map to overlays/{name} that will be used to replace or patch a resource.
    # yaml: ...

    # Diff can be used to ignore the modified state of objects which are amended at runtime.
    # A specific commit or tag can also be watched.
    #
    # diff: ...

    # KeepResources can be used to keep the deployed resources when removing the bundle.
    # keepResources: false

    # If set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.
    # paused: false

    # Controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.
    # rolloutStrategy: ...

    # Contain the actual resources from the git repo which will be deployed.
    resources:
    - content: |
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    name: nginx.yaml

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    #
    # targets: ...

    # This field is used by Fleet internally, and it should not be modified manually.
    # Fleet will copy all targets into targetRestrictions when a Bundle is created for a GitRepo.
    # targetRestrictions: ...

    # Refers to the bundles which must be ready before this bundle can be deployed.
    # dependsOn: ...

    + \ No newline at end of file diff --git a/ref-configuration.html b/ref-configuration.html index 5295449a7..cb6b9aae3 100644 --- a/ref-configuration.html +++ b/ref-configuration.html @@ -4,7 +4,7 @@ Configuration | Fleet - + @@ -14,8 +14,8 @@ Fleet to resources, inherited from a GitRepo, which determines whic resource will not be processed.

    Annotations

    Annotations used by fleet:

    • fleet.cattle.io/agent-namespace
    • fleet.cattle.io/bundle-id
    • fleet.cattle.io/cluster, fleet.cattle.io/cluster-namespace - used on a cluster namespace to reference the cluster registration namespace and cluster name
    • fleet.cattle.io/cluster-group
    • fleet.cattle.io/cluster-registration-namespace
    • fleet.cattle.io/cluster-registration
    • fleet.cattle.io/commit
    • fleet.cattle.io/managed - appears unused
    • fleet.cattle.io/service-account

    Fleet agent configuration

    Tolerations, affinity and resources can be customized for the Fleet agent. These fields can be provided when creating a Cluster, see Registering Downstream Cluster for more info on how to create Clusters. Default configuration will be used if these fields are not provided.

    If you change the resources limits, make sure the limits allow the fleet-agent to work normally.

    Keep in mind that if you downgrade Fleet to a previous version than v0.7.0 Fleet will fallback to the built-in defaults. -Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    - +Agents will redeploy if they had custom affinity. If Fleet version number does not change, redeployment might not be immediate.

    + \ No newline at end of file diff --git a/ref-crds.html b/ref-crds.html index 2a285a592..2f077e0db 100644 --- a/ref-crds.html +++ b/ref-crds.html @@ -4,13 +4,13 @@ Custom Resources Spec | Fleet - +
    -
    Version: Next 🚧

    Custom Resources Spec

    Sub Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.

    When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleList

    BundleList contains a list of Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Bundletrue

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    contentsIdContentsID stores the contents id when deploying contents using an OCI registry.stringfalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    ociReferenceOCIReference is the OCI reference used to store contents, this is only for informational purposes.stringfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true
    resourcesSha256SumResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources fieldstringfalse

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.map[string]stringfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentList

    BundleDeploymentList contains a list of BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleDeploymenttrue

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    deleteNamespaceDeleteNamespace can be used to delete the deployed namespace when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.map[string]stringfalse
    deleteCRDResourcesDeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources.boolfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    ociContentsOCIContents is true when this deployment's contents is stored in an oci registryboolfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releaseRelease is the Helm release IDstringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse
    disableDNSDisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to true by default.boolfalse
    skipSchemaValidationSkipSchemaValidation allows skipping schema validation against the chart valuesboolfalse
    disableDependencyUpdateDisableDependencyUpdate allows skipping chart dependencies updateboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    existExist is true if the resource exists but is not owned by us. This can happen if a resource was adopted by another bundle whereas the first bundle still exists and due to that reports that it does not own it.boolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleNamespaceMappingList

    BundleNamespaceMappingList contains a list of BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleNamespaceMappingtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterList

    ClusterList contains a list of Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Clustertrue

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap.stringfalse
    kubeConfigSecretNamespaceKubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]corev1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]corev1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*corev1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*corev1.ResourceRequirementsfalse
    hostNetworkHostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration).*boolfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentHostNetworkAgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used.boolfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    agentTLSModeAgentTLSMode supports two values: system-store and strict. If set to system-store, instructs the agent to trust CA bundles from the operating system's store. If set to strict, then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse
    garbageCollectionIntervalGarbageCollectionInterval determines how often agents clean up obsolete Helm releases.*metav1.Durationfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupList

    ClusterGroupList contains a list of ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterGrouptrue

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationList

    ClusterRegistrationList contains a list of ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationtrue

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenList

    ClusterRegistrationTokenList contains a list of ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationTokentrue

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse
    sha256sumSHA256Sum of the Content fieldstringfalse

    Back to Custom Resources

    ContentList

    ContentList contains a list of Content

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Contenttrue

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoList

    GitRepoList contains a list of GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepotrue

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    deleteNamespaceDeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    disablePollingDisables git polling. When enabled only webhooks will be used.boolfalse
    ociRegistryOCIRegistry specifies the OCI registry related parameters*OCIRegistrySpecfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    updateGenerationUpdate generation is the force update generation if spec.forceSyncGeneration is setint64false
    commitCommit is the Git commit hash from the last git job run.stringfalse
    webhookCommitWebhookCommit is the latest Git commit hash received from a webhookstringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last Git job run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse
    lastPollingTriggeredLastPollingTime is the last time the polling check was triggeredmetav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    OCIRegistrySpec

    FieldDescriptionSchemeRequired
    referenceReference of the OCI Registrystringfalse
    authSecretNameAuthSecretName contains the auth secret where the OCI regristry credentials are stored.stringfalse
    basicHTTPBasicHTTP uses HTTP connections to the OCI registry when enabled.boolfalse
    insecureSkipTLSInsecureSkipTLS allows connections to OCI registry without certs when enabled.boolfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    GitRepoRestrictionList

    GitRepoRestrictionList contains a list of GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepoRestrictiontrue

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanList

    ImageScanList contains a list of ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ImageScantrue

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    FleetYAML

    FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle.

    FieldDescriptionSchemeRequired
    nameName of the bundle which will be created.stringfalse
    labelsLabels are copied to the bundle and can be used in a dependsOn.selector.map[string]stringfalse
    BundleSpecBundleSpecfalse
    targetCustomizationsTargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster.[]BundleTargetfalse
    imageScansImageScans are optional and used to update container image references in the git repo.[]ImageScanYAMLfalse
    overrideTargetsOverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo.[]GitTargetfalse

    Back to Custom Resources

    ImageScanYAML

    ImageScanYAML is a single entry in the ImageScan list from fleet.yaml.

    FieldDescriptionSchemeRequired
    nameName of the image scan. Unused.stringfalse
    ImageScanSpecImageScanSpecfalse

    Back to Custom Resources

    - +
    Version: Next 🚧

    Custom Resources Spec

    Sub Resources

    Bundle

    Bundle contains the resources of an application and its deployment options. It will be deployed as a Helm chart to target clusters.

    When a GitRepo is scanned it will produce one or more bundles. Bundles are a collection of resources that get deployed to one or more cluster(s). Bundle is the fundamental deployment unit used in Fleet. The contents of a Bundle may be Kubernetes manifests, Kustomize configuration, or Helm charts. Regardless of the source the contents are dynamically rendered into a Helm chart by the agent and installed into the downstream cluster as a Helm release.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleSpectrue
    statusBundleStatustrue

    Back to Custom Resources

    BundleDisplay

    BundleDisplay contains the number of ready, desiredready clusters and a summary state for the bundle.

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    stateState is a summary state for the bundle, calculated over the non-ready resources.stringfalse

    Back to Custom Resources

    BundleList

    BundleList contains a list of Bundle

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Bundletrue

    Back to Custom Resources

    BundleRef

    FieldDescriptionSchemeRequired
    nameName of the bundle.stringfalse
    selectorSelector matching bundle's labels.*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleResource

    BundleResource represents the content of a single resource from the bundle, like a YAML manifest.

    FieldDescriptionSchemeRequired
    nameName of the resource, can include the bundle's internal path.stringfalse
    contentThe content of the resource, can be compressed.stringfalse
    encodingEncoding is either empty or \"base64+gz\".stringfalse

    Back to Custom Resources

    BundleSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. It will be marked as out of sync.boolfalse
    rolloutStrategyRolloutStrategy controls the rollout of bundles, by defining partitions, canaries and percentages for cluster availability.*RolloutStrategyfalse
    resourcesResources contains the resources that were read from the bundle's path. This includes the content of downloaded helm charts.[]BundleResourcefalse
    targetsTargets refer to the clusters which will be deployed to. Targets are evaluated in order and the first one to match is used.[]BundleTargetfalse
    targetRestrictionsTargetRestrictions is an allow list, which controls if a bundledeployment is created for a target.[]BundleTargetRestrictionfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    contentsIdContentsID stores the contents id when deploying contents using an OCI registry.stringfalse

    Back to Custom Resources

    BundleStatus

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of Wrangler conditions that describe the state of the bundle.[]genericcondition.GenericConditionfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    newlyCreatedNewlyCreated is the number of bundle deployments that have been created, not updated.intfalse
    unavailableUnavailable is the number of bundle deployments that are not ready or where the AppliedDeploymentID in the status does not match the DeploymentID from the spec.inttrue
    unavailablePartitionsUnavailablePartitions is the number of unavailable partitions.inttrue
    maxUnavailableMaxUnavailable is the maximum number of unavailable deployments. See rollout configuration.inttrue
    maxUnavailablePartitionsMaxUnavailablePartitions is the maximum number of unavailable partitions. The rollout configuration defines a maximum number or percentage of unavailable partitions.inttrue
    maxNewMaxNew is always 50. A bundle change can only stage 50 bundledeployments at a time.intfalse
    partitionsPartitionStatus lists the status of each partition.[]PartitionStatusfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.BundleDisplayfalse
    resourceKeyResourceKey lists resources, which will likely be deployed. The actual list of resources on a cluster might differ, depending on the helm chart, value templating, etc..[]ResourceKeyfalse
    ociReferenceOCIReference is the OCI reference used to store contents, this is only for informational purposes.stringfalse
    observedGenerationObservedGeneration is the current generation of the bundle.int64true
    resourcesSha256SumResourcesSHA256Sum corresponds to the JSON serialization of the .Spec.Resources fieldstringfalse

    Back to Custom Resources

    BundleSummary

    BundleSummary contains the number of bundle deployments in each state and a list of non-ready resources. It is used in the bundle, clustergroup, cluster and gitrepo status.

    FieldDescriptionSchemeRequired
    notReadyNotReady is the number of bundle deployments that have been deployed where some resources are not ready.intfalse
    waitAppliedWaitApplied is the number of bundle deployments that have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.intfalse
    errAppliedErrApplied is the number of bundle deployments that have been synced from the Fleet controller and the downstream cluster, but with some errors when deploying the bundle.intfalse
    outOfSyncOutOfSync is the number of bundle deployments that have been synced from Fleet controller, but not yet by the downstream agent.intfalse
    modifiedModified is the number of bundle deployments that have been deployed and for which all resources are ready, but where some changes from the Git repository have not yet been synced.intfalse
    readyReady is the number of bundle deployments that have been deployed where all resources are ready.inttrue
    pendingPending is the number of bundle deployments that are being processed by Fleet controller.intfalse
    desiredReadyDesiredReady is the number of bundle deployments that should be ready.inttrue
    nonReadyResourcesNonReadyClusters is a list of states, which is filled for a bundle that is not ready.[]NonReadyResourcefalse

    Back to Custom Resources

    BundleTarget

    BundleTarget declares clusters to deploy to. Fleet will merge the BundleDeploymentOptions from customizations into this struct.

    FieldDescriptionSchemeRequired
    nameName of target. This value is largely for display and logging. If not specified a default name of the format \"target000\" will be usedstringfalse
    clusterNameClusterName to match a specific cluster by name that will be selectedstringfalse
    clusterSelectorClusterSelector is a selector to match clusters. The structure is the standard metav1.LabelSelector format. If clusterGroupSelector or clusterGroup is specified, clusterSelector will be used only to further refine the selection after clusterGroupSelector and clusterGroup is evaluated.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup to match a specific cluster group by name.stringfalse
    clusterGroupSelectorClusterGroupSelector is a selector to match cluster groups.*metav1.LabelSelectorfalse
    doNotDeployDoNotDeploy if set to true, will not deploy to this target.boolfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.map[string]stringfalse

    Back to Custom Resources

    BundleTargetRestriction

    BundleTargetRestriction is used internally by Fleet and should not be modified. It acts as an allow list, to prevent the creation of BundleDeployments from Targets created by TargetCustomizations in fleet.yaml.

    FieldDescriptionSchemeRequired
    namestringfalse
    clusterNamestringfalse
    clusterSelector*metav1.LabelSelectorfalse
    clusterGroupstringfalse
    clusterGroupSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    NonReadyResource

    NonReadyResource contains information about a bundle that is not ready for a given state like \"ErrApplied\". It contains a list of non-ready or modified resources and their states.

    FieldDescriptionSchemeRequired
    nameName is the name of the resource.stringfalse
    bundleStateState is the state of the resource, like e.g. \"NotReady\" or \"ErrApplied\".BundleStatefalse
    messageMessage contains information why the bundle is not ready.stringfalse
    modifiedStatusModifiedStatus lists the state for each modified resource.[]ModifiedStatusfalse
    nonReadyStatusNonReadyStatus lists the state for each non-ready resource.[]NonReadyStatusfalse

    Back to Custom Resources

    Partition

    Partition defines a separate rollout strategy for a set of clusters.

    FieldDescriptionSchemeRequired
    nameA user-friendly name given to the partition used for Display (optional).stringfalse
    maxUnavailableA number or percentage of clusters that can be unavailable in this partition before this partition is treated as done. default: 10%*intstr.IntOrStringfalse
    clusterNameClusterName is the name of a cluster to include in this partitionstringfalse
    clusterSelectorSelector matching cluster labels to include in this partition*metav1.LabelSelectorfalse
    clusterGroupA cluster group name to include in this partitionstringfalse
    clusterGroupSelectorSelector matching cluster group labels to include in this partition*metav1.LabelSelectorfalse

    Back to Custom Resources

    PartitionStatus

    PartitionStatus is the status of a single rollout partition.

    FieldDescriptionSchemeRequired
    nameName is the name of the partition.stringfalse
    countCount is the number of clusters in the partition.intfalse
    maxUnavailableMaxUnavailable is the maximum number of unavailable clusters in the partition.intfalse
    unavailableUnavailable is the number of unavailable clusters in the partition.intfalse
    summarySummary is a summary state for the partition, calculated over its non-ready resources.BundleSummaryfalse

    Back to Custom Resources

    ResourceKey

    ResourceKey lists resources, which will likely be deployed.

    FieldDescriptionSchemeRequired
    kindKind is the k8s api kind of the resource.stringfalse
    apiVersionAPIVersion is the k8s api version of the resource.stringfalse
    namespaceNamespace is the namespace of the resource.stringfalse
    nameName is the name of the resource.stringfalse

    Back to Custom Resources

    RolloutStrategy

    RolloverStrategy controls the rollout of the bundle across clusters.

    FieldDescriptionSchemeRequired
    maxUnavailableA number or percentage of clusters that can be unavailable during an update of a bundle. This follows the same basic approach as a deployment rollout strategy. Once the number of clusters meets unavailable state update will be paused. Default value is 100% which doesn't take effect on update. default: 100%*intstr.IntOrStringfalse
    maxUnavailablePartitionsA number or percentage of cluster partitions that can be unavailable during an update of a bundle. default: 0*intstr.IntOrStringfalse
    autoPartitionSizeA number or percentage of how to automatically partition clusters if no specific partitioning strategy is configured. default: 25%*intstr.IntOrStringfalse
    partitionsA list of definitions of partitions. If any target clusters do not match the configuration they are added to partitions at the end following the autoPartitionSize.[]Partitionfalse

    Back to Custom Resources

    BundleDeployment

    BundleDeployment is used internally by Fleet and should not be used directly. When a Bundle is deployed to a cluster an instance of a Bundle is called a BundleDeployment. A BundleDeployment represents the state of that Bundle on a specific cluster with its cluster-specific customizations. The Fleet agent is only aware of BundleDeployment resources that are created for the cluster the agent is managing.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specBundleDeploymentSpecfalse
    statusBundleDeploymentStatusfalse

    Back to Custom Resources

    BundleDeploymentDisplay

    FieldDescriptionSchemeRequired
    deployedstringfalse
    monitoredstringfalse
    statestringfalse

    Back to Custom Resources

    BundleDeploymentList

    BundleDeploymentList contains a list of BundleDeployment

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleDeploymenttrue

    Back to Custom Resources

    BundleDeploymentOptions

    FieldDescriptionSchemeRequired
    defaultNamespaceDefaultNamespace is the namespace to use for resources that do not specify a namespace. This field is not used to enforce or lock down the deployment to a specific namespace.stringfalse
    namespaceTargetNamespace if present will assign all resource to this namespace and if any cluster scoped resource exists the deployment will fail.stringfalse
    kustomizeKustomize options for the deployment, like the dir containing the kustomization.yaml file.*KustomizeOptionsfalse
    helmHelm options for the deployment, like the chart name, repo and values.*HelmOptionsfalse
    serviceAccountServiceAccount which will be used to perform this deployment.stringfalse
    forceSyncGenerationForceSyncGeneration is used to force a redeploymentint64false
    yamlYAML options, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.*YAMLOptionsfalse
    diffDiff can be used to ignore the modified state of objects which are amended at runtime.*DiffOptionsfalse
    keepResourcesKeepResources can be used to keep the deployed resources when removing the bundleboolfalse
    deleteNamespaceDeleteNamespace can be used to delete the deployed namespace when removing the bundleboolfalse
    ignoreIgnoreOptions can be used to ignore fields when monitoring the bundle.IgnoreOptionsfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    namespaceLabelsNamespaceLabels are labels that will be appended to the namespace created by Fleet.map[string]stringfalse
    namespaceAnnotationsNamespaceAnnotations are annotations that will be appended to the namespace created by Fleet.map[string]stringfalse
    deleteCRDResourcesDeleteCRDResources deletes CRDs. Warning! this will also delete all your Custom Resources.boolfalse

    Back to Custom Resources

    BundleDeploymentResource

    BundleDeploymentResource contains the metadata of a deployed resource.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    createdAtmetav1.Timefalse

    Back to Custom Resources

    BundleDeploymentSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated. If true, BundleDeployments will be marked as out of sync when changes are detected.boolfalse
    stagedOptionsStagedOptions are the deployment options, that are staged for the next deployment.BundleDeploymentOptionsfalse
    stagedDeploymentIDStagedDeploymentID is the ID of the staged deployment.stringfalse
    optionsOptions are the deployment options, that are currently applied.BundleDeploymentOptionsfalse
    deploymentIDDeploymentID is the ID of the currently applied deployment.stringfalse
    dependsOnDependsOn refers to the bundles which must be ready before this bundle can be deployed.[]BundleReffalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    ociContentsOCIContents is true when this deployment's contents is stored in an oci registryboolfalse

    Back to Custom Resources

    BundleDeploymentStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    appliedDeploymentIDstringfalse
    releaseRelease is the Helm release IDstringfalse
    readyboolfalse
    nonModifiedboolfalse
    nonReadyStatus[]NonReadyStatusfalse
    modifiedStatus[]ModifiedStatusfalse
    displayBundleDeploymentDisplayfalse
    syncGeneration*int64false
    resourcesResources lists the metadata of resources that were deployed according to the helm release history.[]BundleDeploymentResourcefalse

    Back to Custom Resources

    ComparePatch

    ComparePatch matches a resource and removes fields from the check for modifications.

    FieldDescriptionSchemeRequired
    kindKind is the kind of the resource to match.stringfalse
    apiVersionAPIVersion is the apiVersion of the resource to match.stringfalse
    namespaceNamespace is the namespace of the resource to match.stringfalse
    nameName is the name of the resource to match.stringfalse
    operationsOperations remove a JSON path from the resource.[]Operationfalse
    jsonPointersJSONPointers ignore diffs at a certain JSON path.[]stringfalse

    Back to Custom Resources

    ConfigMapKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    DiffOptions

    FieldDescriptionSchemeRequired
    comparePatchesComparePatches match a resource and remove fields from the check for modifications.[]ComparePatchfalse

    Back to Custom Resources

    HelmOptions

    HelmOptions for the deployment. For Helm-based bundles, all options can be used, otherwise some options are ignored. For example ReleaseName works with all bundle types.

    FieldDescriptionSchemeRequired
    chartChart can refer to any go-getter URL or OCI registry based helm chart URL. The chart will be downloaded.stringfalse
    repoRepo is the name of the HTTPS helm repo to download the chart from.stringfalse
    releaseNameReleaseName sets a custom release name to deploy the chart as. If not specified a release name will be generated by combining the invoking GitRepo.name + GitRepo.path.stringfalse
    versionVersion of the chart to downloadstringfalse
    timeoutSecondsTimeoutSeconds is the time to wait for Helm operations.intfalse
    valuesValues passed to Helm. It is possible to specify the keys and values as go template strings.*GenericMapfalse
    valuesFromValuesFrom loads the values from configmaps and secrets.[]ValuesFromfalse
    forceForce allows to override immutable resources. This could be dangerous.boolfalse
    takeOwnershipTakeOwnership makes helm skip the check for its own annotationsboolfalse
    maxHistoryMaxHistory limits the maximum number of revisions saved per release by Helm.intfalse
    valuesFilesValuesFiles is a list of files to load values from.[]stringfalse
    waitForJobsWaitForJobs if set and timeoutSeconds provided, will wait until all Jobs have been completed before marking the GitRepo as ready. It will wait for as long as timeoutSecondsboolfalse
    atomicAtomic sets the --atomic flag when Helm is performing an upgradeboolfalse
    disablePreProcessDisablePreProcess disables template processing in valuesboolfalse
    disableDNSDisableDNS can be used to customize Helm's EnableDNS option, which Fleet sets to true by default.boolfalse
    skipSchemaValidationSkipSchemaValidation allows skipping schema validation against the chart valuesboolfalse
    disableDependencyUpdateDisableDependencyUpdate allows skipping chart dependencies updateboolfalse

    Back to Custom Resources

    IgnoreOptions

    IgnoreOptions defines conditions to be ignored when monitoring the Bundle.

    FieldDescriptionSchemeRequired
    conditionsConditions is a list of conditions to be ignored when monitoring the Bundle.[]map[string]stringfalse

    Back to Custom Resources

    KustomizeOptions

    KustomizeOptions for a deployment.

    FieldDescriptionSchemeRequired
    dirDir points to a custom folder for kustomize resources. This folder must contain a kustomization.yaml file.stringfalse

    Back to Custom Resources

    LocalObjectReference

    FieldDescriptionSchemeRequired
    nameName of a resource in the same namespace as the referent.stringtrue

    Back to Custom Resources

    ModifiedStatus

    ModifiedStatus is used to report the status of a resource that is modified. It indicates if the modification was a create, a delete or a patch.

    FieldDescriptionSchemeRequired
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    missingboolfalse
    existExist is true if the resource exists but is not owned by us. This can happen if a resource was adopted by another bundle whereas the first bundle still exists and due to that reports that it does not own it.boolfalse
    deleteboolfalse
    patchstringfalse

    Back to Custom Resources

    NonReadyStatus

    NonReadyStatus is used to report the status of a resource that is not ready. It includes a summary.

    FieldDescriptionSchemeRequired
    uidtypes.UIDfalse
    kindstringfalse
    apiVersionstringfalse
    namespacestringfalse
    namestringfalse
    summarysummary.Summaryfalse

    Back to Custom Resources

    Operation

    Operation of a ComparePatch, usually \"remove\".

    FieldDescriptionSchemeRequired
    opOp is usually \"remove\"stringfalse
    pathPath is the JSON path to remove.stringfalse
    valueValue is usually empty.stringfalse

    Back to Custom Resources

    SecretKeySelector

    FieldDescriptionSchemeRequired
    namespacestringfalse
    keystringfalse

    Back to Custom Resources

    ValuesFrom

    Define helm values that can come from configmap, secret or external. Credit: https://github.com/fluxcd/helm-operator/blob/0cfea875b5d44bea995abe7324819432070dfbdc/pkg/apis/helm.fluxcd.io/v1/types_helmrelease.go#L439

    FieldDescriptionSchemeRequired
    configMapKeyRefThe reference to a config map with release values.*ConfigMapKeySelectorfalse
    secretKeyRefThe reference to a secret with release values.*SecretKeySelectorfalse

    Back to Custom Resources

    YAMLOptions

    YAMLOptions, if using raw YAML these are names that map to overlays/{name} files that will be used to replace or patch a resource.

    FieldDescriptionSchemeRequired
    overlaysOverlays is a list of names that maps to folders in \"overlays/\". If you wish to customize the file ./subdir/resource.yaml then a file ./overlays/myoverlay/subdir/resource.yaml will replace the base file. A file named ./overlays/myoverlay/subdir/resource_patch.yaml will patch the base file.[]stringfalse

    Back to Custom Resources

    BundleNamespaceMapping

    BundleNamespaceMapping maps bundles to clusters in other namespaces.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    bundleSelector*metav1.LabelSelectorfalse
    namespaceSelector*metav1.LabelSelectorfalse

    Back to Custom Resources

    BundleNamespaceMappingList

    BundleNamespaceMappingList contains a list of BundleNamespaceMapping

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]BundleNamespaceMappingtrue

    Back to Custom Resources

    AgentStatus

    FieldDescriptionSchemeRequired
    lastSeenLastSeen is the last time the agent checked in to update the status of the cluster resource.metav1.Timetrue
    namespaceNamespace is the namespace of the agent deployment, e.g. \"cattle-fleet-system\".stringtrue

    Back to Custom Resources

    Cluster

    Cluster corresponds to a Kubernetes cluster. Fleet deploys bundles to targeted clusters. Clusters to which Fleet deploys manifests are referred to as downstream clusters. In the single cluster use case, the Fleet Kubernetes cluster is both the manager and downstream cluster at the same time.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterSpecfalse
    statusClusterStatusfalse

    Back to Custom Resources

    ClusterDisplay

    FieldDescriptionSchemeRequired
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState of the cluster, either one of the bundle states, or \"WaitCheckIn\".stringfalse

    Back to Custom Resources

    ClusterList

    ClusterList contains a list of Cluster

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Clustertrue

    Back to Custom Resources

    ClusterSpec

    FieldDescriptionSchemeRequired
    pausedPaused if set to true, will stop any BundleDeployments from being updated.boolfalse
    clientIDClientID is a unique string that will identify the cluster. It can either be predefined, or generated when importing the cluster.stringfalse
    kubeConfigSecretKubeConfigSecret is the name of the secret containing the kubeconfig for the downstream cluster. It can optionally contain a APIServerURL and CA to override the values in the fleet-controller's configmap.stringfalse
    kubeConfigSecretNamespaceKubeConfigSecretNamespace is the namespace of the secret containing the kubeconfig for the downstream cluster. If unset, it will be assumed the secret can be found in the namespace that the Cluster object resides within.stringfalse
    redeployAgentGenerationRedeployAgentGeneration can be used to force redeploying the agent.int64false
    agentEnvVarsAgentEnvVars are extra environment variables to be added to the agent deployment.[]corev1.EnvVarfalse
    agentNamespaceAgentNamespace defaults to the system namespace, e.g. cattle-fleet-system.stringfalse
    privateRepoURLPrivateRepoURL prefixes the image name and overrides a global repo URL from the agents config.stringfalse
    templateValuesTemplateValues defines a cluster specific mapping of values to be sent to fleet.yaml values templating.*GenericMapfalse
    agentTolerationsAgentTolerations defines an extra set of Tolerations to be added to the Agent deployment.[]corev1.Tolerationfalse
    agentAffinityAgentAffinity overrides the default affinity for the cluster's agent deployment. If this value is nil the default affinity is used.*corev1.Affinityfalse
    agentResourcesAgentResources sets the resources for the cluster's agent deployment.*corev1.ResourceRequirementsfalse
    hostNetworkHostNetwork sets the agent StatefulSet to use hostNetwork: true setting. Allows for provisioning of network related bundles (CNI configuration).*boolfalse

    Back to Custom Resources

    ClusterStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    namespaceNamespace is the cluster namespace, it contains the clusters service account as well as any bundledeployments. Example: \"cluster-fleet-local-cluster-294db1acfa77-d9ccf852678f\"stringfalse
    summarySummary is a summary of the bundledeployments. The resource counts are copied from the gitrepo resource.BundleSummaryfalse
    resourceCountsResourceCounts is an aggregate over the GitRepoResourceCounts.GitRepoResourceCountsfalse
    readyGitReposReadyGitRepos is the number of gitrepos for this cluster that are ready.inttrue
    desiredReadyGitReposDesiredReadyGitRepos is the number of gitrepos for this cluster that are desired to be ready.inttrue
    agentEnvVarsHashAgentEnvVarsHash is a hash of the agent's env vars, used to detect changes.stringfalse
    agentPrivateRepoURLAgentPrivateRepoURL is the private repo URL for the agent that is currently used.stringfalse
    agentHostNetworkAgentHostNetwork defines observed state of spec.hostNetwork setting that is currently used.boolfalse
    agentDeployedGenerationAgentDeployedGeneration is the generation of the agent that is currently deployed.*int64false
    agentMigratedAgentMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old agents don't have this in their status.boolfalse
    agentNamespaceMigratedAgentNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents don't have this in their status.boolfalse
    cattleNamespaceMigratedCattleNamespaceMigrated is always set to true after importing a cluster. If false, it will trigger a migration. Old Fleet agents, don't have this in their status.boolfalse
    agentAffinityHashAgentAffinityHash is a hash of the agent's affinity configuration, used to detect changes.stringfalse
    agentResourcesHashAgentResourcesHash is a hash of the agent's resources configuration, used to detect changes.stringfalse
    agentTolerationsHashAgentTolerationsHash is a hash of the agent's tolerations configuration, used to detect changes.stringfalse
    agentConfigChangedAgentConfigChanged is set to true if any of the agent configuration changed, like the API server URL or CA. Setting it to true will trigger a re-import of the cluster.boolfalse
    apiServerURLAPIServerURL is the currently used URL of the API server that the cluster uses to connect to upstream.stringfalse
    apiServerCAHashAPIServerCAHash is a hash of the upstream API server CA, used to detect changes.stringfalse
    agentTLSModeAgentTLSMode supports two values: system-store and strict. If set to system-store, instructs the agent to trust CA bundles from the operating system's store. If set to strict, then the agent shall only connect to a server which uses the exact CA configured when creating/updating the agent.stringfalse
    displayDisplay contains the number of ready bundles, nodes and a summary state.ClusterDisplayfalse
    agentAgentStatus contains information about the agent.AgentStatusfalse
    garbageCollectionIntervalGarbageCollectionInterval determines how often agents clean up obsolete Helm releases.*metav1.Durationfalse

    Back to Custom Resources

    ClusterGroup

    ClusterGroup is a re-usable selector to target a group of clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterGroupSpectrue
    statusClusterGroupStatustrue

    Back to Custom Resources

    ClusterGroupDisplay

    FieldDescriptionSchemeRequired
    readyClustersReadyClusters is a string in the form \"%d/%d\", that describes the number of clusters that are ready vs. the number of clusters desired to be ready.stringfalse
    readyBundlesReadyBundles is a string in the form \"%d/%d\", that describes the number of bundles that are ready vs. the number of bundles desired to be ready.stringfalse
    stateState is a summary state for the cluster group, showing \"NotReady\" if there are non-ready resources.stringfalse

    Back to Custom Resources

    ClusterGroupList

    ClusterGroupList contains a list of ClusterGroup

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterGrouptrue

    Back to Custom Resources

    ClusterGroupSpec

    FieldDescriptionSchemeRequired
    selectorSelector is a label selector, used to select clusters for this group.*metav1.LabelSelectorfalse

    Back to Custom Resources

    ClusterGroupStatus

    FieldDescriptionSchemeRequired
    clusterCountClusterCount is the number of clusters in the cluster group.inttrue
    nonReadyClusterCountNonReadyClusterCount is the number of clusters that are not ready.inttrue
    nonReadyClustersNonReadyClusters is a list of cluster names that are not ready.[]stringfalse
    conditionsConditions is a list of conditions and their statuses for the cluster group.[]genericcondition.GenericConditionfalse
    summarySummary is a summary of the bundle deployments and their resources in the cluster group.BundleSummaryfalse
    displayDisplay contains the number of ready, desiredready clusters and a summary state for the bundle's resources.ClusterGroupDisplayfalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles in the cluster group.GitRepoResourceCountsfalse

    Back to Custom Resources

    ClusterRegistration

    ClusterRegistration is used internally by Fleet and should not be used directly.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationSpecfalse
    statusClusterRegistrationStatusfalse

    Back to Custom Resources

    ClusterRegistrationList

    ClusterRegistrationList contains a list of ClusterRegistration

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationtrue

    Back to Custom Resources

    ClusterRegistrationSpec

    FieldDescriptionSchemeRequired
    clientIDClientID is a unique string that will identify the cluster. The agent either uses the configured ID or the kubeSystem.UID.stringfalse
    clientRandomClientRandom is a random string that the agent generates. When fleet-controller grants a registration, it creates a registration secret with this string in the name.stringfalse
    clusterLabelsClusterLabels are copied to the cluster resource during the registration.map[string]stringfalse

    Back to Custom Resources

    ClusterRegistrationStatus

    FieldDescriptionSchemeRequired
    clusterNameClusterName is only set after the registration is being processed by fleet-controller.stringfalse
    grantedGranted is set to true, if the request service account is present and its token secret exists. This happens directly before creating the registration secret, roles and rolebindings.boolfalse

    Back to Custom Resources

    ClusterRegistrationToken

    ClusterRegistrationToken is used by agents to register a new cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specClusterRegistrationTokenSpecfalse
    statusClusterRegistrationTokenStatusfalse

    Back to Custom Resources

    ClusterRegistrationTokenList

    ClusterRegistrationTokenList contains a list of ClusterRegistrationToken

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ClusterRegistrationTokentrue

    Back to Custom Resources

    ClusterRegistrationTokenSpec

    FieldDescriptionSchemeRequired
    ttlTTL is the time to live for the token. It is used to calculate the expiration time. If the token expires, it will be deleted.*metav1.Durationfalse

    Back to Custom Resources

    ClusterRegistrationTokenStatus

    FieldDescriptionSchemeRequired
    expiresExpires is the time when the token expires.*metav1.Timefalse
    secretNameSecretName is the name of the secret containing the token.stringfalse

    Back to Custom Resources

    Content

    Content is used internally by Fleet and should not be used directly. It contains the resources from a bundle for a specific target cluster.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    contentContent is a byte array, which contains the manifests of a bundle. The bundle resources are copied into the bundledeployment's content resource, so the downstream agent can deploy them.[]bytefalse
    sha256sumSHA256Sum of the Content fieldstringfalse

    Back to Custom Resources

    ContentList

    ContentList contains a list of Content

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]Contenttrue

    Back to Custom Resources

    CommitSpec

    CommitSpec specifies how to commit changes to the git repository

    FieldDescriptionSchemeRequired
    authorNameAuthorName gives the name to provide when making a commitstringtrue
    authorEmailAuthorEmail gives the email to provide when making a commitstringtrue
    messageTemplateMessageTemplate provides a template for the commit message, into which will be interpolated the details of the change made.stringfalse

    Back to Custom Resources

    CorrectDrift

    FieldDescriptionSchemeRequired
    enabledEnabled correct drift if true.boolfalse
    forceForce helm rollback with --force option will be used if true. This will try to recreate all resources in the release.boolfalse
    keepFailHistoryKeepFailHistory keeps track of failed rollbacks in the helm history.boolfalse

    Back to Custom Resources

    GitRepo

    GitRepo describes a git repository that is watched by Fleet. The resource contains the necessary information to deploy the repo, or parts of it, to target clusters.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specGitRepoSpecfalse
    statusGitRepoStatusfalse

    Back to Custom Resources

    GitRepoDisplay

    FieldDescriptionSchemeRequired
    readyBundleDeploymentsReadyBundleDeployments is a string in the form \"%d/%d\", that describes the number of ready bundledeployments over the total number of bundledeployments.stringfalse
    stateState is the state of the GitRepo, e.g. \"GitUpdating\" or the maximal BundleState according to StateRank.stringfalse
    messageMessage contains the relevant message from the deployment conditions.stringfalse
    errorError is true if a message is present.boolfalse

    Back to Custom Resources

    GitRepoList

    GitRepoList contains a list of GitRepo

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepotrue

    Back to Custom Resources

    GitRepoResource

    GitRepoResource contains metadata about the resources of a bundle.

    FieldDescriptionSchemeRequired
    apiVersionAPIVersion is the API version of the resource.stringfalse
    kindKind is the k8s kind of the resource.stringfalse
    typeType is the type of the resource, e.g. \"apiextensions.k8s.io.customresourcedefinition\" or \"configmap\".stringfalse
    idID is the name of the resource, e.g. \"namespace1/my-config\" or \"backingimagemanagers.storage.io\".stringfalse
    namespaceNamespace of the resource.stringfalse
    nameName of the resource.stringfalse
    incompleteStateIncompleteState is true if a bundle summary has 10 or more non-ready resources or a non-ready resource has more 10 or more non-ready or modified states.boolfalse
    stateState is the state of the resource, e.g. \"Unknown\", \"WaitApplied\", \"ErrApplied\" or \"Ready\".stringfalse
    errorError is true if any Error in the PerClusterState is true.boolfalse
    transitioningTransitioning is true if any Transitioning in the PerClusterState is true.boolfalse
    messageMessage is the first message from the PerClusterStates.stringfalse
    perClusterStatePerClusterState is a list of states for each cluster. Derived from the summaries non-ready resources.[]ResourcePerClusterStatefalse

    Back to Custom Resources

    GitRepoResourceCounts

    GitRepoResourceCounts contains the number of resources in each state.

    FieldDescriptionSchemeRequired
    readyReady is the number of ready resources.inttrue
    desiredReadyDesiredReady is the number of resources that should be ready.inttrue
    waitAppliedWaitApplied is the number of resources that are waiting to be applied.inttrue
    modifiedModified is the number of resources that have been modified.inttrue
    orphanedOrphaned is the number of orphaned resources.inttrue
    missingMissing is the number of missing resources.inttrue
    unknownUnknown is the number of resources in an unknown state.inttrue
    notReadyNotReady is the number of not ready resources. Resources are not ready if they do not match any other state.inttrue

    Back to Custom Resources

    GitRepoSpec

    FieldDescriptionSchemeRequired
    repoRepo is a URL to a git repo to clone and index.stringfalse
    branchBranch The git branch to follow.stringfalse
    revisionRevision A specific commit or tag to operate on.stringfalse
    targetNamespaceEnsure that all resources are created in this namespace Any cluster scoped resource will be rejected if this is set Additionally this namespace will be created on demand.stringfalse
    clientSecretNameClientSecretName is the name of the client secret to be used to connect to the repo It is expected the secret be of type \"kubernetes.io/basic-auth\" or \"kubernetes.io/ssh-auth\".stringfalse
    helmSecretNameHelmSecretName contains the auth secret for a private Helm repository.stringfalse
    helmSecretNameForPathsHelmSecretNameForPaths contains the auth secret for private Helm repository for each path.stringfalse
    helmRepoURLRegexHelmRepoURLRegex Helm credentials will be used if the helm repo matches this regex Credentials will always be used if this is empty or not provided.stringfalse
    caBundleCABundle is a PEM encoded CA bundle which will be used to validate the repo's certificate.[]bytefalse
    insecureSkipTLSVerifyInsecureSkipTLSverify will use insecure HTTPS to clone the repo.boolfalse
    pathsPaths is the directories relative to the git repo root that contain resources to be applied. Path globbing is supported, for example [\"charts/*\"] will match all folders as a subdirectory of charts/ If empty, \"/\" is the default.[]stringfalse
    pausedPaused, when true, causes changes in Git not to be propagated down to the clusters but instead to mark resources as OutOfSync.boolfalse
    serviceAccountServiceAccount used in the downstream cluster for deployment.stringfalse
    targetsTargets is a list of targets this repo will deploy to.[]GitTargetfalse
    pollingIntervalPollingInterval is how often to check git for new updates.*metav1.Durationfalse
    forceSyncGenerationIncrement this number to force a redeployment of contents from Git.int64false
    imageScanIntervalImageScanInterval is the interval of syncing scanned images and writing back to git repo.*metav1.Durationfalse
    imageScanCommitCommit specifies how to commit to the git repo when a new image is scanned and written back to git repo.CommitSpecfalse
    keepResourcesKeepResources specifies if the resources created must be kept after deleting the GitRepo.boolfalse
    deleteNamespaceDeleteNamespace specifies if the namespace created must be deleted after deleting the GitRepo.boolfalse
    correctDriftCorrectDrift specifies how drift correction should work.*CorrectDriftfalse
    disablePollingDisables git polling. When enabled only webhooks will be used.boolfalse
    ociRegistryOCIRegistry specifies the OCI registry related parameters*OCIRegistrySpecfalse

    Back to Custom Resources

    GitRepoStatus

    FieldDescriptionSchemeRequired
    observedGenerationObservedGeneration is the current generation of the resource in the cluster. It is copied from k8s metadata.Generation. The value is incremented for all changes, except for changes to .metadata or .status.int64true
    updateGenerationUpdate generation is the force update generation if spec.forceSyncGeneration is setint64false
    commitCommit is the Git commit hash from the last git job run.stringfalse
    webhookCommitWebhookCommit is the latest Git commit hash received from a webhookstringfalse
    readyClustersReadyClusters is the lowest number of clusters that are ready over all the bundles of this GitRepo.inttrue
    desiredReadyClustersDesiredReadyClusters\tis the number of clusters that should be ready for bundles of this GitRepo.inttrue
    gitJobStatusGitJobStatus is the status of the last Git job run, e.g. \"Current\" if there was no error.stringfalse
    summarySummary contains the number of bundle deployments in each state and a list of non-ready resources.BundleSummaryfalse
    displayDisplay contains a human readable summary of the status.GitRepoDisplayfalse
    conditionsConditions is a list of Wrangler conditions that describe the state of the GitRepo.[]genericcondition.GenericConditionfalse
    resourcesResources contains metadata about the resources of each bundle.[]GitRepoResourcefalse
    resourceCountsResourceCounts contains the number of resources in each state over all bundles.GitRepoResourceCountsfalse
    resourceErrorsResourceErrors is a sorted list of errors from the resources.[]stringfalse
    lastSyncedImageScanTimeLastSyncedImageScanTime is the time of the last image scan.metav1.Timefalse
    lastPollingTriggeredLastPollingTime is the last time the polling check was triggeredmetav1.Timefalse

    Back to Custom Resources

    GitTarget

    GitTarget is a cluster or cluster group to deploy to.

    FieldDescriptionSchemeRequired
    nameName is the name of this target.stringfalse
    clusterNameClusterName is the name of a cluster.stringfalse
    clusterSelectorClusterSelector is a label selector to select clusters.*metav1.LabelSelectorfalse
    clusterGroupClusterGroup is the name of a cluster group in the same namespace as the clusters.stringfalse
    clusterGroupSelectorClusterGroupSelector is a label selector to select cluster groups.*metav1.LabelSelectorfalse

    Back to Custom Resources

    OCIRegistrySpec

    FieldDescriptionSchemeRequired
    referenceReference of the OCI Registrystringfalse
    authSecretNameAuthSecretName contains the auth secret where the OCI regristry credentials are stored.stringfalse
    basicHTTPBasicHTTP uses HTTP connections to the OCI registry when enabled.boolfalse
    insecureSkipTLSInsecureSkipTLS allows connections to OCI registry without certs when enabled.boolfalse

    Back to Custom Resources

    ResourcePerClusterState

    ResourcePerClusterState is generated for each non-ready resource of the bundles.

    FieldDescriptionSchemeRequired
    stateState is the state of the resource.stringfalse
    errorError is true if the resource is in an error state, copied from the bundle's summary for non-ready resources.boolfalse
    transitioningTransitioning is true if the resource is in a transitioning state, copied from the bundle's summary for non-ready resources.boolfalse
    messageMessage combines the messages from the bundle's summary. Messages are joined with the delimiter ';'.stringfalse
    patchPatch for modified resources.*GenericMapfalse
    clusterIdClusterID is the id of the cluster.stringfalse

    Back to Custom Resources

    GitRepoRestriction

    GitRepoRestriction is a resource that can optionally be used to restrict the options of GitRepos in the same namespace.

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    defaultServiceAccountDefaultServiceAccount overrides the GitRepo's default service account.stringfalse
    allowedServiceAccountsAllowedServiceAccounts is a list of service accounts that GitRepos are allowed to use.[]stringfalse
    allowedRepoPatternsAllowedRepoPatterns is a list of regex patterns that restrict the valid values of the Repo field of a GitRepo.[]stringfalse
    defaultClientSecretNameDefaultClientSecretName overrides the GitRepo's default client secret.stringfalse
    allowedClientSecretNamesAllowedClientSecretNames is a list of client secret names that GitRepos are allowed to use.[]stringfalse
    allowedTargetNamespacesAllowedTargetNamespaces restricts TargetNamespace to the given namespaces. If AllowedTargetNamespaces is set, TargetNamespace must be set.[]stringfalse

    Back to Custom Resources

    GitRepoRestrictionList

    GitRepoRestrictionList contains a list of GitRepoRestriction

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]GitRepoRestrictiontrue

    Back to Custom Resources

    AlphabeticalPolicy

    AlphabeticalPolicy specifies a alphabetical ordering policy.

    FieldDescriptionSchemeRequired
    orderOrder specifies the sorting order of the tags. Given the letters of the alphabet as tags, ascending order would select Z, and descending order would select A.stringfalse

    Back to Custom Resources

    ImagePolicyChoice

    ImagePolicyChoice is a union of all the types of policy that can be supplied.

    FieldDescriptionSchemeRequired
    semverSemVer gives a semantic version range to check against the tags available.*SemVerPolicyfalse
    alphabeticalAlphabetical set of rules to use for alphabetical ordering of the tags.*AlphabeticalPolicyfalse

    Back to Custom Resources

    ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ObjectMetafalse
    specImageScanSpecfalse
    statusImageScanStatusfalse

    Back to Custom Resources

    ImageScanList

    ImageScanList contains a list of ImageScan

    FieldDescriptionSchemeRequired
    metadatametav1.ListMetafalse
    items[]ImageScantrue

    Back to Custom Resources

    ImageScanSpec

    API is taken from https://github.com/fluxcd/image-reflector-controller

    FieldDescriptionSchemeRequired
    tagNameTagName is the tag ref that needs to be put in manifest to replace fieldsstringfalse
    gitrepoNameGitRepo reference namestringfalse
    imageImage is the name of the image repositorystringfalse
    intervalInterval is the length of time to wait between scans of the image repository.metav1.Durationfalse
    secretRefSecretRef can be given the name of a secret containing credentials to use for the image registry. The secret should be created with kubectl create secret docker-registry, or the equivalent.*corev1.LocalObjectReferencefalse
    suspendThis flag tells the controller to suspend subsequent image scans. It does not apply to already started scans. Defaults to false.boolfalse
    policyPolicy gives the particulars of the policy to be followed in selecting the most recent imageImagePolicyChoicetrue

    Back to Custom Resources

    ImageScanStatus

    FieldDescriptionSchemeRequired
    conditions[]genericcondition.GenericConditionfalse
    lastScanTimeLastScanTime is the last time image was scannedmetav1.Timefalse
    latestImageLatestImage gives the first in the list of images scanned by the image repository, when filtered and ordered according to the policy.stringfalse
    latestTagLatest tag is the latest tag filtered by the policystringfalse
    latestDigestLatestDigest is the digest of latest tagstringfalse
    observedGenerationint64false
    canonicalImageNameCanonicalName is the name of the image repository with all the implied bits made explicit; e.g., docker.io/library/alpine rather than alpine.stringfalse

    Back to Custom Resources

    SemVerPolicy

    SemVerPolicy specifies a semantic version policy.

    FieldDescriptionSchemeRequired
    rangeRange gives a semver range for the image tag; the highest version within the range that's a tag yields the latest image.stringtrue

    Back to Custom Resources

    FleetYAML

    FleetYAML is the top-level structure of the fleet.yaml file. The fleet.yaml file adds options to a bundle. Any directory with a fleet.yaml is automatically turned into a bundle.

    FieldDescriptionSchemeRequired
    nameName of the bundle which will be created.stringfalse
    labelsLabels are copied to the bundle and can be used in a dependsOn.selector.map[string]stringfalse
    BundleSpecBundleSpecfalse
    targetCustomizationsTargetCustomizations are used to determine how resources should be modified per target. Targets are evaluated in order and the first one to match a cluster is used for that cluster.[]BundleTargetfalse
    imageScansImageScans are optional and used to update container image references in the git repo.[]ImageScanYAMLfalse
    overrideTargetsOverrideTargets overrides targets that are defined in the GitRepo resource. If overrideTargets is provided the bundle will not inherit targets from the GitRepo.[]GitTargetfalse

    Back to Custom Resources

    ImageScanYAML

    ImageScanYAML is a single entry in the ImageScan list from fleet.yaml.

    FieldDescriptionSchemeRequired
    nameName of the image scan. Unused.stringfalse
    ImageScanSpecImageScanSpecfalse

    Back to Custom Resources

    + \ No newline at end of file diff --git a/ref-fleet-yaml.html b/ref-fleet-yaml.html index f2906c2fb..b6086a71c 100644 --- a/ref-fleet-yaml.html +++ b/ref-fleet-yaml.html @@ -4,7 +4,7 @@ fleet.yaml | Fleet - + @@ -25,8 +25,8 @@ library are available.

    Note that if the functions output changes with bundle will get redeployed.

    The template context has the following keys:

    • .ClusterValues are retrieved from target cluster's spec.templateValues
    • .ClusterLabels and .ClusterAnnotations are the labels and annotations in the cluster resource.
    • .ClusterName as the fleet's cluster resource name.
    • .ClusterNamespace as the namespace in which the cluster resource exists.

    To access Labels or Annotations by their key name:

    ${ get .ClusterLabels "management.cattle.io/cluster-display-name" }

    Note: The fleet.yaml must be valid yaml. Templating uses ${ } as delims, unlike Helm which uses {{ }}. These fleet.yaml template delimiters can be -escaped using backticks, eg.:

    foo-bar-${`${PWD}`}

    will result in the following text:

    foo-bar-${PWD}
    - +escaped using backticks, eg.:

    foo-bar-${`${PWD}`}

    will result in the following text:

    foo-bar-${PWD}
    + \ No newline at end of file diff --git a/ref-gitrepo.html b/ref-gitrepo.html index f9ba71995..178441d63 100644 --- a/ref-gitrepo.html +++ b/ref-gitrepo.html @@ -4,14 +4,14 @@ GitRepo Resource | Fleet - +
    Version: Next 🚧

    GitRepo Resource

    The GitRepo resource describes git repositories, how to access them and where the bundles are located.

    The content of the resource corresponds to the GitRepoSpec. -For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private git repository you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key

    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret

    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*

    # Contains the auth secret for private Helm repository for each path.
    # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)
    #
    # helmSecretNameForPaths: multi-helm-secret

    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle

    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true

    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # When disablePolling is set to true the git repo won't be checked periodically.
    # It will rely on webhooks only.
    # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)
    # disablePolling: false

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...

    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    - +For more information on how to use GitRepo resource, e.g. how to watch private repositories, see Create a GitRepo Resource.

    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    # Any name can be used here
    name: my-repo
    # For single cluster use fleet-local, otherwise use the namespace of
    # your choosing
    namespace: fleet-local
    spec:
    # This can be a HTTPS or git URL. If you are using a git URL then
    # clientSecretName will probably need to be set to supply a credential.
    # repo is the only required parameter for a repo to be monitored.
    #
    repo: https://github.com/rancher/fleet-examples

    # Enforce all resources go to this target namespace. If a cluster scoped
    # resource is found the deployment will fail.
    #
    # targetNamespace: app1

    # Any branch can be watched, this field is optional. If not specified the
    # branch is assumed to be master
    #
    # branch: master

    # A specific commit or tag can also be watched.
    #
    # revision: v0.3.0

    # For a private git repository you must supply a clientSecretName. A default
    # secret can be set at the namespace level using the GitRepoRestriction
    # type. Secrets must be of the type "kubernetes.io/ssh-auth" or
    # "kubernetes.io/basic-auth". The secret is assumed to be in the
    # same namespace as the GitRepo
    #
    # clientSecretName: my-ssh-key

    # If fleet.yaml contains a private Helm repo that requires authentication,
    # provide the credentials in a K8s secret and specify them here.
    # Danger: the credentials will be sent to all repositories referenced from
    # this gitrepo. See section below for more information.
    #
    # helmSecretName: my-helm-secret

    # Helm credentials from helmSecretName will be used if the helm repository url matches this regular expression.
    # Credentials will always be used if it is empty or not provided
    #
    # helmRepoURLRegex: https://charts.rancher.io/*

    # Contains the auth secret for private Helm repository for each path.
    # See [Create a GitRepo Resource](.gitrepo-add#use-different-helm-credentials-for-each-path)
    #
    # helmSecretNameForPaths: multi-helm-secret

    # To add additional ca-bundle for self-signed certs, caBundle can be
    # filled with base64 encoded pem data. For example:
    # `cat /path/to/ca.pem | base64 -w 0`
    #
    # caBundle: my-ca-bundle

    # Disable SSL verification for git repo
    #
    # insecureSkipTLSVerify: true

    # A git repo can read multiple paths in a repo at once.
    # The below field is expected to be an array of paths and
    # supports path globbing (ex: some/*/path)
    #
    # Example:
    # paths:
    # - single-path
    # - multiple-paths/*
    paths:
    - simple

    # PollingInterval configures how often fleet checks the git repo. The default
    # is 15 seconds.
    # Setting this to zero does not disable polling. It results in a 15s
    # interval, too.
    # As checking a git repo incurs a CPU cost, raising this value can help
    # lowering fleetcontroller's CPU usage if tens of git repos are used or more
    #
    # pollingInterval: 15s

    # When disablePolling is set to true the git repo won't be checked periodically.
    # It will rely on webhooks only.
    # See [Using Webhooks Instead of Polling](https://fleet.rancher.io/webhook)
    # disablePolling: false

    # Paused causes changes in Git to not be propagated down to the clusters but
    # instead mark resources as OutOfSync
    #
    # paused: false

    # Increment this number to force a redeployment of contents from Git
    #
    # forceSyncGeneration: 0

    # The service account that will be used to perform this deployment.
    # This is the name of the service account that exists in the
    # downstream cluster in the cattle-fleet-system namespace. It is assumed
    # this service account already exists so it should be create before
    # hand, most likely coming from another git repo registered with
    # the Fleet manager.
    #
    # serviceAccount: moreSecureAccountThanClusterAdmin

    # Target clusters to deploy to if running Fleet in a multi-cluster
    # style. Refer to the "Mapping to Downstream Clusters" docs for
    # more information.
    # If empty, the "default" cluster group is used.
    #
    # targets: ...

    # Drift correction removes any external change made to resources managed by Fleet. It performs a helm rollback, which uses
    # a three-way merge strategy by default.
    # It will try to update all resources by doing a PUT request if force is enabled. Three-way strategic merge might fail when updating
    # an item inside of an array as it will try to add a new item instead of replacing the existing one. This can be fixed by using force.
    # Keep in mind that resources might be recreated if force is enabled.
    # Failed rollback will be removed from the helm history unless keepFailHistory is set to true.
    #
    # correctDrift:
    # enabled: false
    # force: false #Warning: it might recreate resources if set to true
    # keepFailHistory: false
    + \ No newline at end of file diff --git a/ref-registration.html b/ref-registration.html index b822da26c..4646e94ff 100644 --- a/ref-registration.html +++ b/ref-registration.html @@ -4,7 +4,7 @@ Cluster Registration Internals | Fleet - + @@ -21,8 +21,8 @@ cluster, the server values also exist in the kubeconfig secret, referenced by the Cluster resource. In this case the kubeconfig secret contains the upstream server URL and CA, next to the downstream's kubeconfig. If the settings are present in the kubeconfig secret, they -override the configured values.

    Registration Secrets

    Fleet Cluster Registration in Rancher

    Rancher installs the fleet helm chart. The API server URL and CA are derived from Rancher's settings.

    Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller.

    Import Cluster into Rancher

    When the user runs curl | kubectl apply, the applied manifest includes the rancher agent deployment.

    The deployment contains a secret cattle-credentials- which contains the API URL and a token.

    The Rancher agent starts up and reports downstream's kubeconfig to upstream.

    Rancher then creates the fleet Cluster resource, which references a kubeconfig secret.

    👉Fleet will use this kubeconfig to deploy the agent on the downstream cluster.

    - +override the configured values.

    Registration Secrets

    Fleet Cluster Registration in Rancher

    Rancher installs the fleet helm chart. The API server URL and CA are derived from Rancher's settings.

    Fleet will pass these values to a Fleet agent, so it can connect back to the Fleet controller.

    Import Cluster into Rancher

    When the user runs curl | kubectl apply, the applied manifest includes the rancher agent deployment.

    The deployment contains a secret cattle-credentials- which contains the API URL and a token.

    The Rancher agent starts up and reports downstream's kubeconfig to upstream.

    Rancher then creates the fleet Cluster resource, which references a kubeconfig secret.

    👉Fleet will use this kubeconfig to deploy the agent on the downstream cluster.

    + \ No newline at end of file diff --git a/ref-resources.html b/ref-resources.html index d24f07feb..8177acd0a 100644 --- a/ref-resources.html +++ b/ref-resources.html @@ -4,13 +4,13 @@ List of Deployed Resources | Fleet - +
    -
    Version: Next 🚧

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    - +
    Version: Next 🚧

    List of Deployed Resources

    After installing Fleet in Rancher these resources are created in the upstream cluster.

    TypeNameNamespace
    From Helm, intial setup:
    ClusterRolefleet-controller-
    ClusterRolegitjob-
    ClusterRoleBindingfleet-controller-
    ClusterRoleBindinggitjob-binding-
    ConfigMapfleet-controllercattle-fleet-system
    Deploymentfleet-controllercattle-fleet-system
    Deploymentgitjobcattle-fleet-system
    Rolefleet-controllercattle-fleet-system
    Rolegitjobcattle-fleet-system
    RoleBindingfleet-controllercattle-fleet-system
    RoleBindinggitjobcattle-fleet-system
    Servicegitjobcattle-fleet-system
    ServiceAccountfleet-controllercattle-fleet-system
    ServiceAccountgitjobcattle-fleet-system
    Generated:
    clusters.fleet.cattle.iolocalfleet-local
    clusters.provisioning.cattle.iolocalfleet-local
    clusters.management.cattle.iolocal-
    ClusterGroupdefaultfleet-local
    Bundlefleet-agent-localfleet-local
    For each registered cluster:
    clusters.provisioning.cattle.ioby default fleet-default
    clusters.management.cattle.iogenerated-
    clusters.fleet.cattle.iofleet-default
    Bundlefleet-default
    BundleDeploymentcluster-fleet-local-local-IDfleet-agent-local

    Also see [namespaces]

    + \ No newline at end of file diff --git a/ref-status-fields.html b/ref-status-fields.html index 23f0ea0e8..2032e06c9 100644 --- a/ref-status-fields.html +++ b/ref-status-fields.html @@ -4,14 +4,14 @@ Status Fields | Fleet - +
    Version: Next 🚧

    Status Fields

    Cluster and Bundle Display States

    Clusters and Bundles have different states in each phase of applying Bundles.

    Bundles

    Ready: Bundles have been deployed and all resources are ready.

    NotReady: Bundles have been deployed and some resources are not ready.

    WaitApplied: Bundles have been synced from Fleet controller and downstream cluster, but are waiting to be deployed.

    ErrApplied: Bundles have been synced from the Fleet controller and the downstream cluster, but there were some errors when deploying the Bundle.

    OutOfSync: Bundles have been synced from Fleet controller, but downstream agent hasn't synced the change yet.

    Pending: Bundles are being processed by Fleet controller.

    Modified: Bundles have been deployed and all resources are ready, but there are some changes that were not made from the Git Repository.

    Clusters

    WaitCheckIn: Waiting for agent to report registration information and cluster status back.

    NotReady: There are bundles in this cluster that are in NotReady state.

    WaitApplied: There are bundles in this cluster that are in WaitApplied state.

    ErrApplied: There are bundles in this cluster that are in ErrApplied state.

    OutOfSync: There are bundles in this cluster that are in OutOfSync state.

    Pending: There are bundles in this cluster that are in Pending state.

    Modified: There are bundles in this cluster that are in Modified state.

    Ready: Bundles in this cluster have been deployed and all resources are ready.

    GitRepo Conditions

    Ready:

    Active:

    Reconciling:

    Stalled: for errors

    Resources List

    The resources lists contain the deployed resources, categorized under Bundles and GitRepos.

    Bundles

    The deployed resources within bundles can be found in status.ResourceKey. This key represents the actual resources deployed via bundleDeployments.

    GitRepos

    Similar to bundles, the deployed resources in GitRepos are listed in status.Resources. This list is also derived from bundleDeployments.

    Resource Counts

    This shows how resource counts are propagated from one resource to another: -Status Propagation

    GitRepos

    The status.ResourceCounts list for GitRepos is derived from bundleDeployments.

    Clusters

    In Clusters, the status.ResourceCounts list is derived from GitRepos.

    ClusterGroups

    In ClusterGroups, the status.ResourceCounts list is also derived from GitRepos.

    - +Status Propagation

    GitRepos

    The status.ResourceCounts list for GitRepos is derived from bundleDeployments.

    Clusters

    In Clusters, the status.ResourceCounts list is derived from GitRepos.

    ClusterGroups

    In ClusterGroups, the status.ResourceCounts list is also derived from GitRepos.

    + \ No newline at end of file diff --git a/resource-counts-and-resources-list.html b/resource-counts-and-resources-list.html index e8f7f78d5..190d9171d 100644 --- a/resource-counts-and-resources-list.html +++ b/resource-counts-and-resources-list.html @@ -4,13 +4,13 @@ resource-counts-and-resources-list | Fleet - +
    -
    Version: Next 🚧

    resource-counts-and-resources-list

    - +
    Version: Next 🚧

    resource-counts-and-resources-list

    + \ No newline at end of file diff --git a/resources-during-deployment.html b/resources-during-deployment.html index 28aebc0dd..0022c4894 100644 --- a/resources-during-deployment.html +++ b/resources-during-deployment.html @@ -4,13 +4,13 @@ Custom Resources During Deployment | Fleet - + - +
    + \ No newline at end of file diff --git a/search.html b/search.html index aadd0afda..9ccc2833f 100644 --- a/search.html +++ b/search.html @@ -4,13 +4,13 @@ Search the documentation | Fleet - + - + \ No newline at end of file diff --git a/troubleshooting.html b/troubleshooting.html index 43afb1fac..8763a34b0 100644 --- a/troubleshooting.html +++ b/troubleshooting.html @@ -4,7 +4,7 @@ Troubleshooting | Fleet - + @@ -12,8 +12,8 @@
    Version: Next 🚧

    Troubleshooting

    This section contains commands and tips to troubleshoot Fleet.

    How Do I...

    Fetch the log from fleet-controller?

    In the local management cluster where the fleet-controller is deployed, run the following command with your specific fleet-controller pod name filled in:

    $ kubectl logs -l app=fleet-controller -n cattle-fleet-system

    Fetch the log from the fleet-agent?

    Go to each downstream cluster and run the following command for the local cluster with your specific fleet-agent pod name filled in:

    # Downstream cluster
    $ kubectl logs -l app=fleet-agent -n cattle-fleet-system
    # Local cluster
    $ kubectl logs -l app=fleet-agent -n cattle-local-fleet-system

    Fetch detailed error logs from GitRepos and Bundles?

    Normally, errors should appear in the Rancher UI. However, if there is not enough information displayed about the error there, you can research further by trying one or more of the following as needed:

    • For more information about the bundle, click on bundle, and the YAML mode will be enabled.
    • For more information about the GitRepo, click on GitRepo, then click on View Yaml in the upper right of the screen. After viewing the YAML, check status.conditions; a detailed error message should be displayed here.
    • Check the fleet-controller for synching errors.
    • Check the fleet-agent log in the downstream cluster if you encounter issues when deploying the bundle.

    Fetch detailed status from GitRepos and Bundles?

    For debugging and bug reports the raw JSON of the resources status fields is most useful. This can be accessed in the Rancher UI, or through kubectl:

    kubectl get bundle -n fleet-local fleet-agent-local -o=jsonpath={.status}
    kubectl get gitrepo -n fleet-default gitrepo-name -o=jsonpath={.status}

    Check a chart rendering error in Kustomize?

    Check the fleet-controller logs and the fleet-agent logs.

    Check errors about watching or checking out the GitRepo, or about the downloaded Helm repo in fleet.yaml?

    Check the gitjob-controller logs using the following command with your specific gitjob pod name filled in:

    $ kubectl logs -f $gitjob-pod-name -n cattle-fleet-system

    Note that there are two containers inside the pod: the step-git-source container that clones the git repo, and the fleet container that applies bundles based on the git repo.

    The pods will usually have images named rancher/tekton-utils with the gitRepo name as a prefix. Check the logs for these Kubernetes job pods in the local management cluster as follows, filling in your specific gitRepoName pod name and namespace:

    $ kubectl logs -f $gitRepoName-pod-name -n namespace

    Check the status of the fleet-controller?

    You can check the status of the fleet-controller pods by running the commands below:

    kubectl -n cattle-fleet-system logs -l app=fleet-controller
    kubectl -n cattle-fleet-system get pods -l app=fleet-controller
    NAME                                READY   STATUS    RESTARTS   AGE
    fleet-controller-64f49d756b-n57wq 1/1 Running 0 3m21s

    Enable debug logging for fleet-controller and fleet-agent?

    Available in Rancher v2.6.3 (Fleet v0.3.8), the ability to enable debug logging has been added.

    • Go to the Dashboard, then click on the local cluster in the left navigation menu
    • Select Apps & Marketplace, then Installed Apps from the dropdown
    • From there, you will upgrade the Fleet chart with the value debug=true. You can also set debugLevel=5 if desired.

    Additional Solutions for Other Fleet Issues

    Naming conventions for CRDs

    1. For CRD terms like clusters and gitrepos, you must reference the full CRD name. For example, the cluster CRD's complete name is cluster.fleet.cattle.io, and the gitrepo CRD's complete name is gitrepo.fleet.cattle.io.

    2. Bundles, which are created from the GitRepo, follow the pattern $gitrepoName-$path in the same workspace/namespace where the GitRepo was created. Note that $path is the path directory in the git repository that contains the bundle (fleet.yaml).

    3. BundleDeployments, which are created from the bundle, follow the pattern $bundleName-$clusterName in the namespace clusters-$workspace-$cluster-$generateHash. Note that $clusterName is the cluster to which the bundle will be deployed.

    HTTP secrets in Github

    When testing Fleet with private git repositories, you will notice that HTTP secrets are no longer supported in Github. To work around this issue, follow these steps:

    1. Create a personal access token in Github.
    2. In Rancher, create an HTTP secret with your Github username.
    3. Use your token as the secret.

    Fleet fails with bad response code: 403

    If your GitJob returns the error below, the problem may be that Fleet cannot access the Helm repo you specified in your fleet.yaml:

    time="2021-11-04T09:21:24Z" level=fatal msg="bad response code: 403"

    Perform the following steps to assess:

    • Check that your repo is accessible from your dev machine, and that you can download the Helm chart successfully
    • Check that your credentials for the git repo are valid

    Helm chart repo: certificate signed by unknown authority

    If your GitJob returns the error below, you may have added the wrong certificate chain:

    time="2021-11-11T05:55:08Z" level=fatal msg="Get \"https://helm.intra/virtual-helm/index.yaml\": x509: certificate signed by unknown authority"

    Please verify your certificate with the following command:

    context=playground-local
    kubectl get secret -n fleet-default helm-repo -o jsonpath="{['data']['cacerts']}" --context $context | base64 -d | openssl x509 -text -noout
    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    7a:1e:df:79:5f:b0:e0:be:49:de:11:5e:d9:9c:a9:71
    Signature Algorithm: sha512WithRSAEncryption
    Issuer: C = CH, O = MY COMPANY, CN = NOP Root CA G3
    ...

    Fleet deployment stuck in modified state

    When you deploy bundles to Fleet, some of the components are modified, and this causes the "modified" flag in the Fleet environment.

    To ignore the modified flag for the differences between the Helm install generated by fleet.yaml and the resource in your cluster, add a diff.comparePatches to the fleet.yaml for your Deployment, as shown in this example:

    defaultNamespace: <namespace name>
    helm:
    releaseName: <release name>
    repo: <repo name>
    chart: <chart name>
    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    operations:
    - {"op":"remove", "path":"/spec/template/spec/hostNetwork"}
    - {"op":"remove", "path":"/spec/template/spec/nodeSelector"}
    jsonPointers: # jsonPointers allows to ignore diffs at certain json path
    - "/spec/template/spec/priorityClassName"
    - "/spec/template/spec/tolerations"

    To determine which operations should be removed, observe the logs from fleet-agent on the target cluster. You should see entries similar to the following:

    level=error msg="bundle monitoring-monitoring: deployment.apps monitoring/monitoring-monitoring-kube-state-metrics modified {\"spec\":{\"template\":{\"spec\":{\"hostNetwork\":false}}}}"

    Based on the above log, you can add the following entry to remove the operation:

    {"op":"remove", "path":"/spec/template/spec/hostNetwork"}

    GitRepo or Bundle stuck in modified state

    Modified means that there is a mismatch between the actual state and the desired state, the source of truth, which lives in the git repository.

    1. Check the bundle diffs documentation for more information.

    2. You can also force update the gitrepo to perform a manual resync. Select GitRepo on the left navigation bar, then select Force Update.

    Bundle has a Horizontal Pod Autoscaler (HPA) in modified state

    For bundles with an HPA, the expected state is Modified, as the bundle contains fields that differ from the state of the Bundle at deployment - usually ReplicaSet.

    You must define a patch in the fleet.yaml to ignore this field according to GitRepo or Bundle stuck in modified state.

    Here is an example of such a patch for the deployment nginx in namespace default:

    diff:
    comparePatches:
    - apiVersion: apps/v1
    kind: Deployment
    name: nginx
    namespace: default
    operations:
    - {"op": "remove", "path": "/spec/replicas"}

    What if the cluster is unavailable, or is in a WaitCheckIn state?

    You will need to re-import and restart the registration process: Select Cluster on the left navigation bar, then select Force Update

    caution

    WaitCheckIn status for Rancher v2.5: The cluster will show in WaitCheckIn status because the fleet-controller is attempting to communicate with Fleet using the Rancher service IP. However, Fleet must communicate directly with Rancher via the Kubernetes service DNS using service discovery, not through the proxy. For more, see the Rancher docs.

    GitRepo complains with gzip: invalid header

    When you see an error like the one below ...

    Error opening a gzip reader for /tmp/getter154967024/archive: gzip: invalid header

    ... the content of the helm chart is incorrect. Manually download the chart to your local machine and check the content.

    Agent is no longer registered

    You can force a redeployment of an agent for a given cluster by setting redeployAgentGeneration.

    kubectl patch clusters.fleet.cattle.io -n fleet-local local --type=json -p '[{"op": "add", "path": "/spec/redeployAgentGeneration", "value": -1}]'

    Migrate the local cluster to the Fleet default cluster workspace?

    Users can create new workspaces and move clusters across workspaces. -It's currently not possible to move the local cluster from fleet-local to another workspace.

    Bundle failed to deploy: "resource already exists" Error

    If your bundle encounters the following error message during deployment:

    not installed: rendered manifests contain a resource that already
    exists. Unable to continue with install: ClusterRole "grafana-clusterrole"
    in namespace "" exists and cannot be imported into the current release: invalid
    ownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"
    must equal "ns-2": current value is "ns-1"

    This error occurs because a Helm resource with the same releaseName already exists in the cluster. To resolve this issue, you need to change the releaseName of the resource you want to create to avoid the conflict.

    - +It's currently not possible to move the local cluster from fleet-local to another workspace.

    Bundle failed to deploy: "resource already exists" Error

    If your bundle encounters the following error message during deployment:

    not installed: rendered manifests contain a resource that already
    exists. Unable to continue with install: ClusterRole "grafana-clusterrole"
    in namespace "" exists and cannot be imported into the current release: invalid
    ownership metadata; annotation validation error: key "meta.helm.sh/release-namespace"
    must equal "ns-2": current value is "ns-1"

    This error occurs because a Helm resource with the same releaseName already exists in the cluster. To resolve this issue, you need to change the releaseName of the resource you want to create to avoid the conflict.

    + \ No newline at end of file diff --git a/tut-deployment.html b/tut-deployment.html index 2089d9dcb..300dbbb3b 100644 --- a/tut-deployment.html +++ b/tut-deployment.html @@ -4,7 +4,7 @@ Creating a Deployment | Fleet - + @@ -13,8 +13,8 @@ For more details on the options that are available per Git repository see Adding a GitRepo.

    Single-Cluster Examples

    All examples will deploy content to clusters with no per-cluster customizations. This is a good starting point to understand the basics of structuring Git repos for Fleet.

    An example using Helm. We are deploying the helm example to the local cluster.

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment:

    fleet.yaml
    namespace: fleet-helm-example

    # Custom helm options
    helm:
    # The release name to use. If empty a generated release name will be used
    releaseName: guestbook

    # The directory of the chart in the repo. Also any valid go-getter supported
    # URL can be used there is specify where to download the chart from.
    # If repo below is set this value if the chart name in the repo
    chart: ""

    # An https to a valid Helm repository to download the chart from
    repo: ""

    # Used if repo is set to look up the version of the chart
    version: ""

    # Force recreate resource that can not be updated
    force: false

    # How long for helm to wait for the release to be active. If the value
    # is less that or equal to zero, we will not wait in Helm
    timeoutSeconds: 0

    # Custom values that will be passed as values.yaml to the installation
    values:
    replicas: 2

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-local namespace contains the local cluster resource. The local fleet-agent will create the deployment in the fleet-helm-example namespace.

    kubectl apply -n fleet-local -f - <<EOF
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - single-cluster/helm
    EOF

    Multi-Cluster Examples

    The examples below will deploy a multi git repo to multiple clusters at once and configure the app differently for each target.

    An example using Helm. We are deploying the helm example and customizing it per target cluster

    The repository contains a helm chart and an optional fleet.yaml to configure the deployment. The fleet.yaml is used to configure different deployment options, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-helm-example
    targetCustomizations:
    - name: dev
    helm:
    values:
    replication: false
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    helm:
    values:
    replicas: 3
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    helm:
    values:
    serviceType: LoadBalancer
    replicas: 3
    clusterSelector:
    matchLabels:
    env: prod

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: helm
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/helm
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod

    By applying the gitrepo resource to the upstream cluster, fleet will start to monitor the repository and create deployments:

    kubectl apply -n fleet-default -f gitrepo.yaml
    - +The application will be customized as follows per environment:

    • Dev clusters: Only the redis leader is deployed and not the followers.
    • Test clusters: Scale the front deployment to 3
    • Prod clusters: Scale the front deployment to 3 and set the service type to LoadBalancer

    The fleet.yaml is used to control which 'yaml' overlays are used, depending on the cluster's labels:

    fleet.yaml
    namespace: fleet-mc-manifest-example
    targetCustomizations:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev
    yaml:
    overlays:
    # Refers to overlays/noreplication folder
    - noreplication

    - name: test
    clusterSelector:
    matchLabels:
    env: test
    yaml:
    overlays:
    # Refers to overlays/scale3 folder
    - scale3

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    yaml:
    # Refers to overlays/servicelb, scale3 folders
    overlays:
    - servicelb
    - scale3

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    To create the deployment, we apply the custom resource to the upstream cluster. The fleet-default namespace, by default, contains the downstream cluster resources. The chart will be deployed to all clusters in the fleet-default namespace, which have a labeled cluster resources that matches any entry under targets:.

    gitrepo.yaml
    kind: GitRepo
    apiVersion: fleet.cattle.io/v1alpha1
    metadata:
    name: manifests
    namespace: fleet-default
    spec:
    repo: https://github.com/rancher/fleet-examples
    paths:
    - multi-cluster/manifests
    targets:
    - name: dev
    clusterSelector:
    matchLabels:
    env: dev

    - name: test
    clusterSelector:
    matchLabels:
    env: test

    - name: prod
    clusterSelector:
    matchLabels:
    env: prod
    kubectl apply -n fleet-default -f gitrepo.yaml
    + \ No newline at end of file diff --git a/uninstall.html b/uninstall.html index 478939d31..8394728b5 100644 --- a/uninstall.html +++ b/uninstall.html @@ -4,15 +4,15 @@ Uninstall | Fleet - + - +two commands:

    helm -n cattle-fleet-system uninstall fleet
    helm -n cattle-fleet-system uninstall fleet-crd
    caution

    Uninstalling the CRDs will remove all deployed workloads.

    + \ No newline at end of file diff --git a/webhook.html b/webhook.html index 7329ee0af..7c1c22c4a 100644 --- a/webhook.html +++ b/webhook.html @@ -4,15 +4,15 @@ Using Webhooks Instead of Polling | Fleet - +
    Version: Next 🚧

    Using Webhooks Instead of Polling

    By default, Fleet utilizes polling (default: every 15 seconds) to pull from a Git repo. This is a convenient default that works reasonably well for a small number of repos (up to a few tens).

    For installations with multiple tens up to hundreds of Git repos, and in general to reduce latency (the time between a push to Git and fleet reacting to it), configuring webhooks is recommended instead of polling.

    Fleet currently supports Azure DevOps, GitHub, GitLab, Bitbucket, Bitbucket Server, and Gogs.

    1. Configure the webhook service. Fleet uses a gitjob service to handle webhook requests. Create an ingress that points to the gitjob service.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: gitjob
    port:
    number: 80

    If you want to have the webhook available using the same host name as your Rancher or another service, you can use the following YAML with the URL http://your.domain.com/gitjob. The below YAML is specific for the Nginx Ingress Controller:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    name: webhook-ingress
    namespace: cattle-fleet-system
    spec:
    rules:
    - host: your.domain.com
    http:
    paths:
    - path: /gitjob(/|$)(.*)
    pathType: ImplementationSpecific
    backend:
    service:
    name: gitjob
    port:
    number: 80
    info

    You can configure TLS on ingress.

    2. Go to your webhook provider and configure the webhook callback url. Here is a Github example.

    Configuring a secret is optional. This is used to validate the webhook payload as the payload should not be trusted by default. If your webhook server is publicly accessible to the Internet, then it is recommended to configure the secret. If you do configure the -secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs
    Azure DevOpsazure-username
    Azure DevOpsazure-password

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    For Azure DevOps:

    • Enable basic authentication in Azure
    • Create a secret containing the credentials for the basic authentication
    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    - +secret, follow step 3.

    note

    only application/json is supported due to the limitation of webhook library.

    caution

    If you configured the webhook the polling interval will be automatically adjusted to 1 hour.

    3. (Optional) Configure webhook secret. The secret is for validating webhook payload. Make sure to put it in a k8s secret called gitjob-webhook in cattle-fleet-system.

    ProviderK8s Secret Key
    GitHubgithub
    GitLabgitlab
    BitBucketbitbucket
    BitBucketServerbitbucket-server
    Gogsgogs
    Azure DevOpsazure-username
    Azure DevOpsazure-password

    For example, to create a secret containing a GitHub secret to validate the webhook payload, run:

    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=github=webhooksecretvalue

    For Azure DevOps:

    • Enable basic authentication in Azure
    • Create a secret containing the credentials for the basic authentication
    kubectl create secret generic gitjob-webhook -n cattle-fleet-system --from-literal=azure-username=user --from-literal=azure-password=pass123

    4. Go to your git provider and test the connection. You should get a HTTP response code.

    + \ No newline at end of file